Как работает 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!
1 ответ
Как это могло сработать?!? Первый сорт по длине. Второй вид должен отменить сортировку первого!
Нет, сравнение второго рода выполняется только тогда, когда первичное сравнение находит два равных значения.
IOrderedEnumerable
Реализация делает это, запоминая все сравнения, эффективно - или, как еще один способ выразить это, позволяя вам построить сравнение из "текущего сравнения и другого, к которому можно обратиться, когда это возвращает 0".
У меня есть серия постов в блоге, в которой подробно рассматривается LINQ to Objects, что обеспечивает полную альтернативную реализацию. Основа IOrderedEnumerable
рассматривается в частях 26a и 26b, с более подробной информацией и оптимизацией в 26c и 26d.
На самом деле, я даже не могу написать функцию, которая возвращает IOrderedEnumerable!
Вы абсолютно можете - либо возвращая значение, возвращенное из OrderBy
Или, осуществляя это самостоятельно.