14

我想了解 ThenBy 在 .Net 中的工作原理。(我知道怎么用,就是不明白微软是怎么实现的!)

根据文档,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 的函数!

4

1 回答 1

17

它怎么可能起作用?!?第一种是按长度排序。第二个排序应该撤消第一个排序!

不,第二次排序比较仅在主要比较找到两个相等的值时进行。

IOrderedEnumerable实现通过有效地记住所有比较来做到这一点 - 或者,作为另一种说法,允许您从“当前比较和另一个在返回 0 时咨询的比较”构建比较。

我有一个博客文章系列,它深入探讨了 LINQ to Objects,提供了一个完整的替代实现。26a26bIOrderedEnumerable部分介绍了的基础,26c26d部分提供了更多细节和优化。

事实上,我什至无法编写返回 IOrderedEnumerable 的函数!

您绝对可以 - 通过返回从 中返回的值OrderBy,或者自己实现它。

于 2012-05-31T05:36:04.163 回答