C# List.Sort四種重載總結(jié)
在實(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)文章
C#實(shí)現(xiàn)日期格式轉(zhuǎn)換的公共方法類實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)日期格式轉(zhuǎn)換的公共方法類,結(jié)合完整實(shí)例形式分析了C#針對各種常見日期格式的轉(zhuǎn)換方法,涉及C#字符串、日期、時(shí)間相關(guān)操作技巧,需要的朋友可以參考下2017-01-01
基于C#實(shí)現(xiàn)手機(jī)號碼歸屬地接口調(diào)用
這篇文章主要介紹了基于C#實(shí)現(xiàn)手機(jī)號碼歸屬地接口調(diào)用的相關(guān)資料,需要的朋友可以參考下2016-02-02
通過VS中的數(shù)據(jù)源選擇對話框簡單實(shí)現(xiàn)數(shù)據(jù)庫連接配置[圖]
通過VS中的數(shù)據(jù)源選擇對話框簡單實(shí)現(xiàn)數(shù)據(jù)庫連接配置[圖]...2007-03-03
用?FieldMask?提高?C#?gRpc?的服務(wù)性能
這篇文章主要介紹了用?FieldMask?提高?C#?gRpc?的服務(wù)性能,FieldMask?是一個(gè)?protobuf?消息,包含一個(gè)名為?paths?的字段,用于指定用于指定讀取操作返回或更新操作修改的字,下文詳細(xì)內(nèi)容,需要的朋友可以參考一下2022-03-03
時(shí)間戳與時(shí)間相互轉(zhuǎn)換(php .net精確到毫秒)
本文給大家分享的時(shí)間戳與時(shí)間相互轉(zhuǎn)換(php .net精確到毫秒) ,感興趣的朋友一起學(xué)習(xí)吧2015-09-09
C#使用DateAndTime.DateDiff實(shí)現(xiàn)計(jì)算年齡
這篇文章主要為大家詳細(xì)介紹了C#如何使用DateAndTime.DateDiff實(shí)現(xiàn)根據(jù)生日計(jì)算年齡,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2024-01-01

