最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# List.Sort四種重載總結(jié)

 更新時(shí)間:2025年12月01日 15:31:42   作者:紅黑色的圣西羅  
本文詳細(xì)分析了C#中List.Sort()方法的四種重載形式及其實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在實(shí)現(xiàn)工作中的系統(tǒng)功能時(shí),總是會出現(xiàn)對數(shù)據(jù)排序的需求,而排序算法在C#中有提前封裝好的方法,即List.Sort

1. Sort方法的四種重載

在List中

可以看到,分別為

List<T>.Sort();   
List<T>.Sort(IComparer<T> Comparer);
List<T>.Sort(int index, int count, IComparer<T> Comparer);
List<T>.Sort(Comparison<T> comparison);

其中,第一,第二兩個(gè)方法內(nèi)部其實(shí)都是在調(diào)用第三個(gè)方法,只不過參數(shù)傳的不一樣。

第三個(gè)方法的index參數(shù)表示從哪個(gè)索引開始,count表示要排序的個(gè)數(shù),comparer表示實(shí)現(xiàn)了IComparer接口的類型,用于實(shí)現(xiàn)排序規(guī)則,可以看到前兩個(gè)方法都是從頭開始全量排序。
最終調(diào)用的都是Array.Sort()方法

2. 具體使用

- List.Sort();

可以看到對于int類型默認(rèn)是實(shí)現(xiàn)升序排序的,對于bool類型,false會排在true前面

那如果是一個(gè)復(fù)雜類型呢?

可以看到,傳的是一個(gè)Demo類型的對象,但是直接使用Sort方法會報(bào)錯(cuò),提示“未能比較數(shù)組中的兩個(gè)元素,必須至少有一個(gè)對象實(shí)現(xiàn)IComparable”

那么為什么會報(bào)這個(gè)錯(cuò)呢,深入源碼來看,從調(diào)用堆??磻?yīng)該是走到了這一步,在Array中

繼續(xù)深入,來到ArraySortHelper類

注意此時(shí)的comparer因?yàn)槭莕ull,所以給了一個(gè)Comparer.Default

最終來到了

然后在調(diào)用comparer.Compare方法時(shí)報(bào)錯(cuò)

深入Comparer類,查看Default

即最終調(diào)用的是ObjectComparer.Compare方法

進(jìn)行最終深入,來到Comparer類的Compare方法

首先會判斷m_compareInfo是否為空,那么看上面

可以看到,雖然Default會傳入一個(gè)compareInfo,但是因?yàn)閭魅氲膶ο箢愋驮趶?qiáng)制類型轉(zhuǎn)換為string后其實(shí)是null,所以會進(jìn)行下面的判斷。

即比較的最終執(zhí)行是判斷比較的兩個(gè)對象是否實(shí)現(xiàn)了IComparable接口,而傳入的Demo類型并沒有實(shí)現(xiàn)這個(gè)接口,所以最終報(bào)錯(cuò)

- IComparable 接口

按照上面探索的結(jié)果,直接使用Sort方法最終會判斷傳入類型是否實(shí)現(xiàn)了IComparable 接口,那么int類型和bool類型能夠直接使用說明兩者實(shí)現(xiàn)了IComparable 接口

先看int類型

可以看到int實(shí)現(xiàn)了IComparable 的CompareTo方法,規(guī)則為小于返回-1,大于返回1,等于返回0,說明此時(shí)返回-1是升序,返回1是降序

再看bool類型

規(guī)則為等于返回0,如果自身為false返回-1,如果自身為true,返回1

再回到

可以看到,當(dāng)comparer.Compare返回大于0時(shí),會將比較的雙方進(jìn)行交換,所以int類型和bool類型的最終結(jié)果顯而易見,即大的數(shù)和true會被交換到后面

對于string類型,其也實(shí)現(xiàn)了IComparable 接口,但字符串的比較是通過比較每一個(gè)字符的Unicode 編碼大小,這里不再贅述

- 復(fù)雜類型的比較

綜上所述,如果需要比較一個(gè)復(fù)雜的類型,那么必須實(shí)現(xiàn)IComparable 接口

比如這里的Demo類型,實(shí)現(xiàn)了自定義的比較方法,先比較name,再比較age

或者,使用List.Sort(IComparer Comparer),即需要實(shí)現(xiàn)IComparer接口,定義一個(gè)比較器

DemoComparer實(shí)現(xiàn)了IComparer接口,在內(nèi)部實(shí)現(xiàn)了自定義的Demo類型的比較

- List.Sort(Comparison comparison)

或者

可以看到這里會使用Array的方法,將comparison轉(zhuǎn)換為IComparer的比較器

最終調(diào)用的就是傳入的Comparison委托

到此這篇關(guān)于C# List.Sort四種重載總結(jié)的文章就介紹到這了,更多相關(guān)C# List.Sort重載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

桃园市| 莱西市| 博白县| 海安县| 枣庄市| 昌乐县| 武定县| 日土县| 锡林郭勒盟| 巴塘县| 射洪县| 同心县| 赞皇县| 奈曼旗| 道孚县| 乌鲁木齐市| 顺义区| 娄烦县| 长岭县| 雷州市| 惠来县| 万源市| 平武县| 临高县| 徐闻县| 五台县| 无为县| 黑山县| 老河口市| 项城市| 邹城市| 会同县| 中牟县| 湖南省| 道真| 彭阳县| 古田县| 新巴尔虎右旗| 岑巩县| 青阳县| 巴林右旗|