天天看點

[c#基礎]泛型集合的自定義類型排序

最近總有種感覺,自己複習的進度總被項目中的問題給耽擱了,項目中遇到的問題,不總結又不行,隻能将複習基礎方面的東西放後再放後。一直沒研究過太深奧的東西,過去一年一直在基礎上打轉,寫代碼,反編譯,不停的重複。一直相信,在你不知道要幹嘛的時候,浮躁的時候,不如回到最基礎的東西上,或許換種思考方式,會有不一樣的收獲。

先看一個簡單的例子,int類型的集合:

[c#基礎]泛型集合的自定義類型排序
[c#基礎]泛型集合的自定義類型排序
[c#基礎]泛型集合的自定義類型排序

經sort方法之後,采用了升序的方式進行排列的。

[c#基礎]泛型集合的自定義類型排序
[c#基礎]泛型集合的自定義類型排序
[c#基礎]泛型集合的自定義類型排序

可見sort方法有三個重載方法。

[c#基礎]泛型集合的自定義類型排序
[c#基礎]泛型集合的自定義類型排序

對person進行sort後輸出,就會出現如下異常:

[c#基礎]泛型集合的自定義類型排序

對自定義的person類型進行排序,出現異常。那為什麼int類型就沒有呢?可以反編譯一下,你會發現:

[c#基礎]泛型集合的自定義類型排序

可見int類型是實作了icomparable這個接口的。那麼如果讓自定義類型person也可以排序,那麼試試實作該接口。

[c#基礎]泛型集合的自定義類型排序
[c#基礎]泛型集合的自定義類型排序

compareto方法的參數為要與之進行比較的另一個同類型對象,傳回值為int類型,如果傳回值大于0,表示第一個對象大于第二個對象,如果傳回值小于0,表示第一個對象小于第二個對象,如果傳回0,則兩個對象相等。

定義好預設比較規則後,就可以通過不帶參數的sort方法對集合進行排序。

測試結果:

[c#基礎]泛型集合的自定義類型排序

以上采用的sort()方法排序的結果。

 實際使用中,經常需要對集合按照多種不同規則進行排序,這就需要定義其他比較規則,可以在compare方法中定義,該方法屬于icomparer<t>泛型接口,請看下面的代碼:

[c#基礎]泛型集合的自定義類型排序
[c#基礎]泛型集合的自定義類型排序

compare方法的參數為要進行比較的兩個同類型對象,傳回值為int類型,傳回值處理規則與compareto方法相同。其中的comparer.default傳回一個内置的comparer對象,用于比較兩個同類型對象。

    下面用新定義的這個比較器對集合進行排序:

[c#基礎]泛型集合的自定義類型排序
[c#基礎]泛型集合的自定義類型排序
[c#基礎]泛型集合的自定義類型排序

同上面的類似,隻是這個是取範圍的。

sort方法的一個重載是comparison<t>類型的參數,那麼comparison到底是什麼東東呢?,說實話,不f12還真發現不了。

[c#基礎]泛型集合的自定義類型排序
[c#基礎]泛型集合的自定義類型排序

看到這裡就該笑了,委托啊,那麼豈不是可以匿名委托,豈不是更友善啊。那麼排序可以這樣了。

[c#基礎]泛型集合的自定義類型排序
[c#基礎]泛型集合的自定義類型排序

結果:

[c#基礎]泛型集合的自定義類型排序
[c#基礎]泛型集合的自定義類型排序
[c#基礎]泛型集合的自定義類型排序

 從下班弄到現在,一直整理筆記。泛型集合的排序選一個順手的就行。 

部落格位址:

<a href="http://www.cnblogs.com/wolf-sun">http://www.cnblogs.com/wolf-sun/</a>

部落格版權:

本文以學習、研究和分享為主,歡迎轉載,但必須在文章頁面明顯位置給出原文連接配接。

如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起讨論,共同進步!

再次感謝您耐心的讀完本篇文章。

轉載:http://www.cnblogs.com/wolf-sun/p/3574347.html

繼續閱讀