做過.NET開發的都知道,Linq查詢表達式中,OrderBy可以實作序列的升序排列。
是以,我以為上述代碼執行的結果是這樣的:
然而,結果是這樣的:

那麼,為什麼會是這樣的?
其實我心裡第一反應是字元串排序是按照ASCII碼排序,但是好像并沒有10,11,12,13,14等對應的ASCII碼,這就有點尴尬了。
經過幾番百度後,或許找到了一種解釋:ASCII碼隻針對字元,而10,11,12等有兩個字元,是以編譯器隻會認前一個字元,是以10,11,12,13,14等字元串都被看做是'1'這個字元,如此便解釋的通了。
OrderBy方法有兩個重載,其中一個多了一個IComparer<T>類型的參數,通過實作IComparer<T>接口,我們可以自定義排序規則:
Icomparer<T>接口需要實作Compare方法,比較兩個參數,根據泛型類型T來決定兩個參數的類型。方法傳回0表示x和y相等,傳回負數表示x小于y,傳回正數表示x大于y。上述代表表示當x和y都可以轉為int類型時,按int類型時的大小來決定誰大誰小,否則就按預設的比較方法來決定誰大誰小。
調用OrderBy時傳入一個StringNumberComparer對象:
檢視運作結果:
成功實作了數字字元串升序排序。
通過實作IComparer<T>接口的Compare方法,可以任意自定義規則進行排序的比較,是一個高度開放的API,數字字元串排序隻是其中一個案例而已!