Dot-Net
.Net 中的 IOrderedEnumerable.ThenBy() 是如何工作的?
我想了解 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,提供了一個完整的替代實現。26a和26b
IOrderedEnumerable部分介紹了的基礎,26c和26d部分提供了更多細節和優化。事實上,我什至無法編寫返回 IOrderedEnumerable 的函式!
您絕對可以 - 通過返回從 中返回的值
OrderBy,或者自己實現它。