重學c#系列——linq(2) [二十八]

敖毛毛發表於2022-12-15

前言

前文提及到了一些基礎的linq的基礎,那麼這一節是一些補充。

正文

關於一個orderby的問題。

比如我們輸入兩個order by。

這裡告訴我們多個order by是沒有意義的,如果多個那麼就是最後一個是有意義的。

這裡要使用,不要去記最後一個是有意義的,這會讓你的思維混亂,記得用一個orderby就好。用完order by之後就可以用then by了。

這裡提及一下原理,前面提及到包裝器,為什麼生效的是最後一個呢。

透過包裝成一個OrderedEnumerable:

然後foreach 前文說過其實是呼叫GetEnumerator:

那麼只要最後一個包裝才生效。

這裡其實是做了最佳化的,為什麼多個order by 只有一個生效,這是符合現實的。

比如一個是前面男生後面女生 ,前面女生後面男生,那麼排序只有一個生效,前面的排序都是無效的。

order by之後,要使用then by,這個then by 就是order by排完序之後的排序。

比如order by前面男生後面女生,那麼then by 是按照身高進行排序。

那麼就是男生從第低到高,女生從低搞到,這樣子的排序。

then by 其實也是OrderedEnumerable。

CreateOrderedEnumerable 值得看一下:

看到這個parent,那麼應該想到鏈式結構。

就是透過這種鏈式結構,完成了這個order by 和 then by。有興趣可以看一下。資料結構這不就用上了。

有興趣可以看下。 原理就是上一個排序的時候,如果相等,那麼就交給下一個排序進行比較。

張三  26  180

李四  25 180

王哥 27 179

張三  17 175
張三  26  175

orderby(name).thenby(age).thenby(high)

比如就是按照name和age 還有high。

那麼首先會得到3個陣列:

張三 李四 王哥 張三 張三 
26,25,27,17,26
180,180,179,175,175

那麼第一個陣列會進行快速排序,當張三 0號 張三 3號相等的時候。

那麼就會差第二個陣列的0號和3號比較,因為26大17,那麼17就排在前面。(order 從小到大)

當張三0號和張三4號相等,然後第二個陣列的0號和4號也相等,那麼就看第三個陣列的0號和4號了。

大致就是這個理論了,其實只是做了一次排序。

下一節為groupjoin和selectmany還有匿名匿名型別linq,下下節為linq表示式。

該系列剩餘40餘篇,c# IL 閱讀在彙編系列之後,為重學c#系列的外篇。

相關文章