Подтвердить что ты не робот

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

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

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

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

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!

4b9b3361

Ответ 1

Как это могло бы работать?!? Первый вид по длине. Второй сорт должен отменить сортировку первого!

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

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

У меня есть серия сообщений блога, которая в некоторой степени переходит в LINQ к объектам, обеспечивая полную альтернативную реализацию. Основание IOrderedEnumerable описано в часть 26a и 26b, с более подробной информацией и оптимизацией в 26c и 26d.

На самом деле, я даже не могу написать функцию, которая возвращает IOrderedEnumerable!

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