C# List.Sort四種重載總結(jié)
在實(shí)現(xiàn)工作中的系統(tǒng)功能時,總是會出現(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);
其中,第一,第二兩個方法內(nèi)部其實(shí)都是在調(diào)用第三個方法,只不過參數(shù)傳的不一樣。
第三個方法的index參數(shù)表示從哪個索引開始,count表示要排序的個數(shù),comparer表示實(shí)現(xiàn)了IComparer接口的類型,用于實(shí)現(xiàn)排序規(guī)則,可以看到前兩個方法都是從頭開始全量排序。
最終調(diào)用的都是Array.Sort()方法
2. 具體使用
- List.Sort();




可以看到對于int類型默認(rèn)是實(shí)現(xiàn)升序排序的,對于bool類型,false會排在true前面
那如果是一個復(fù)雜類型呢?


可以看到,傳的是一個Demo類型的對象,但是直接使用Sort方法會報(bào)錯,提示“未能比較數(shù)組中的兩個元素,必須至少有一個對象實(shí)現(xiàn)IComparable”
那么為什么會報(bào)這個錯呢,深入源碼來看,從調(diào)用堆??磻?yīng)該是走到了這一步,在Array中

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

注意此時的comparer因?yàn)槭莕ull,所以給了一個Comparer.Default
最終來到了

然后在調(diào)用comparer.Compare方法時報(bào)錯
深入Comparer類,查看Default


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

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

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

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

即比較的最終執(zhí)行是判斷比較的兩個對象是否實(shí)現(xiàn)了IComparable接口,而傳入的Demo類型并沒有實(shí)現(xiàn)這個接口,所以最終報(bào)錯
- IComparable 接口
按照上面探索的結(jié)果,直接使用Sort方法最終會判斷傳入類型是否實(shí)現(xiàn)了IComparable 接口,那么int類型和bool類型能夠直接使用說明兩者實(shí)現(xiàn)了IComparable 接口
先看int類型


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


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

可以看到,當(dāng)comparer.Compare返回大于0時,會將比較的雙方進(jìn)行交換,所以int類型和bool類型的最終結(jié)果顯而易見,即大的數(shù)和true會被交換到后面
對于string類型,其也實(shí)現(xiàn)了IComparable 接口,但字符串的比較是通過比較每一個字符的Unicode 編碼大小,這里不再贅述
- 復(fù)雜類型的比較
綜上所述,如果需要比較一個復(fù)雜的類型,那么必須實(shí)現(xiàn)IComparable 接口


比如這里的Demo類型,實(shí)現(xiàn)了自定義的比較方法,先比較name,再比較age
或者,使用List.Sort(IComparer Comparer),即需要實(shí)現(xiàn)IComparer接口,定義一個比較器

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)MQTT服務(wù)端與客戶端通訊功能
這篇文章介紹了C#實(shí)現(xiàn)MQTT服務(wù)端與客戶端通訊的功能,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01
C#實(shí)現(xiàn)文件操作(復(fù)制,移動,刪除)的方法詳解
File類提供了常見的文件操作函數(shù),包括復(fù)制、移動、刪除、創(chuàng)建快捷方式等,本文將通過一些簡單的示例為大家詳細(xì)講講具體的使用,希望對大家有所幫助2023-05-05

