前言
前文提及到了一些基礎的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#系列的外篇。