Как работает IOrderedEnumerable.ThenBy () в .Net?

Я хочу понять, как ThenBy работает в .Net. (Я знаю, как его использовать, я просто не понимаю, как Microsoft это реализовала!)

Согласно документации,string_list.OrderBy(Function (x) x.length).ThenBy(Function (x) x) должен вывести список строк, упорядоченных по длинеand then в алфавитном порядке. Как это могло сработать?!? Первый сорт по длине. Вторая сортировка должна отменить сортировку первой!

Предположим, этот код:

Dim sorted_by_length As IOrderedEnumerable(Of String)
sorted_by_length = string_list.OrderBy(Function (x) x.length)
sorted_by_length = sorted_by_length.ThenBy(Function

Здесь я пытаюсь реализовать последнюю строку без использованияThenBy:

Dim sorted_by_length As IOrderedEnumerable(Of String)
sorted_by_length = string_list.OrderBy(Function (x) x.length)
'my implementation of OrderBy:
Dim e as IEnumerator(Of String) = sorted_by_length.GetEnumerator
Do While e.MoveNext
    'I have no idea what to write here!
Loop

Здесь происходит какое-то волшебство ... Есть ли какая-нибудь функция e.GetPreviousKeySelector ()? Фактически, я даже не могу написать функцию, которая возвращает IOrderedEnumerable!

 user16639031 мая 2012 г., 07:29
Разве реализация исходного кода IEnumerable не доступна для просмотра в .NET (с некоторыми условиями лицензии MS)? Если это не доступно / приемлемо, всегда есть Mono ...

Ответы на вопрос(1)

Решение Вопроса

How could it possibly work?!? The first sort is by length. The second sort should undo the sorting of the first one!

Нет, сравнение второго рода выполняется только тогда, когда первичное сравнение находит два равных значения.

IOrderedEnumerable Реализация делает это, запоминая все сравнения, эффективно - или, как еще один способ выразить это, позволяя вам построить сравнение из & quot; текущего сравнения и другого, к которому можно обратиться, когда оно возвращает 0 & quot ;.

у меня естьсерия постов в блоге который углубляется в LINQ to Objects, предоставляя полную альтернативную реализацию. ОсноваIOrderedEnumerable покрыта вчасть 26а а также26b, с более подробной информацией и оптимизацией в26c а также26d.

In fact, I can't even write a function that returns IOrderedEnumerable!

Вы абсолютно можете - либо возвращая значение, возвращенное изOrderByИли, осуществляя это самостоятельно.

 Eyal31 мая 2012 г., 08:21
Пробел в моем понимании пытался написатьIterator Функция, которая возвращает IOrderedEnumerable. Ваше сообщение проясняет: OrderBy () не является функцией итератора. Скорее, он возвращает IOrderedEnumerable, который может создать итератор с GetEnumerator или связать другой вид с помощью CreateOrderedEnumerable.

Ваш ответ на вопрос