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

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

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

在實(shí)現(xiàn)工作中的系統(tǒng)功能時(shí),總是會(huì)出現(xiàn)對(duì)數(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è)方法,只不過(guò)參數(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();

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

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

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

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

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

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

最終來(lái)到了

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

深入Comparer類,查看Default

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

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

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

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

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

- IComparable 接口

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

先看int類型

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

再看bool類型

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

再回到

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

對(duì)于string類型,其也實(shí)現(xiàn)了IComparable 接口,但字符串的比較是通過(guò)比較每一個(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)

或者

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

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

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

相關(guān)文章

最新評(píng)論

鹿邑县| 浦北县| 通城县| 济南市| 博罗县| 栾川县| 石渠县| 湘乡市| 射阳县| 河北省| 若尔盖县| 凉城县| 桂阳县| 淮安市| 靖远县| 宁强县| 梁平县| 吴江市| 密云县| 永泰县| 河池市| 绥德县| 台东市| 甘孜县| 萨嘎县| 临清市| 莱西市| 响水县| 九寨沟县| 杭州市| 通道| 屏东县| 桦甸市| 平泉县| 古浪县| 玉林市| 宝清县| 保山市| 宝兴县| 海伦市| 会东县|