Dot-Net

.Net 中的 IOrderedEnumerable.ThenBy() 是如何工作的?

  • March 24, 2019

我想了解 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 的函式!

它怎麼可能起作用?!?第一種是按長度排序。第二個排序應該撤消第一個排序!

不,第二次排序比較僅在主要比較找到兩個相等的值時進行。

IOrderedEnumerable實現通過有效地記住所有比較來做到這一點 - 或者,作為另一種說法,允許您從“目前比較和另一個在返回 0 時進行諮詢的比較”建構比較。

我有一個部落格文章系列,它深入探討了 LINQ to Objects,提供了一個完整的替代實現。26a26bIOrderedEnumerable部分介紹了的基礎,26c26d部分提供了更多細節和優化。

事實上,我什至無法編寫返回 IOrderedEnumerable 的函式!

您絕對可以 - 通過返回從 中返回的值OrderBy,或者自己實現它。

引用自:https://stackoverflow.com/questions/10827899