C sort 方法詳解及示例

2021-07-24 10:07:12 字數 2760 閱讀 1269



諸如list等泛型集合類,直接提供了sort()方法用於將集合中的元素進行排序。

但是,其前提是集合中存放的是可直接排序的基本型別,如list, list,如果

我們定義了乙個自定義型別 class myclass,並建立乙個自定義型別的集合如list,

那麼無參的sort()方法就不可用了,因為不知道如何排序了。這時就需要借助:

icomparer 和 icomparable

首先,我們來看一下c#泛型list提供的sort方法:

泛型list類的sort方法有四種形式,分別是

1,不帶有任何引數的sort方法----sort();

2,帶有比較器引數的sort方法 ----sort(icomparer)

3,帶有比較**方法引數的sort方法----sort(comparison<(of <(t>)>))

4,帶有比較器引數,可以指定排序範圍的sort方法----sort(int32, int32 icomparer(t))

【解析:】第一種方法

使用這種方法不是對list中的任何元素物件都可以進行排序,list中的元素物件必須繼承icomparable介面,並且要實現icomparable介面中的compareto()方法,在compareto()方法中要自己實現物件的比較規則。

例如,int32和double都是實現了icomparable介面並過載了compareto方法的結構。(注:int和double都是int32和double的別名(alias))

【解析:】第二種方法

2,帶有比較器引數的sort方法 ----sort(icomparer),

1)建立乙個額外的比較器類:其實就相當於將排序功能中的比較操作,留個使用者來完成。這個比較操作必須在實現了icomparer介面的自定義比較類中完成;如:

class mycomparer:icomparer

2)制定比較規則實現比較方法:因為介面中有乙個用於比較的過載函式compare,所在在比較器類中我們必須實現它,完成自己希望的比較。所謂自己希望的比較就是說自己實現自定義物件的比較規則,例如你知道自定義類myclass中哪個屬性適合用來排序,那麼就選擇這個屬性作為整個自定義類物件的排序屬性,如該類中有年齡,學號,入學日期等屬性,你可以選擇年齡屬性作為排序屬性。如:

public class mycomparer:icomparer }

3)使用比較器的排序方法呼叫:然後,在自定義型別的集合如listmylist,上就可以進行sort排序了,如

mylist.sort(new mycomparer());

【解析:】第三種方法

3,帶有比較**方法引數的sort方法----sort(comparison<(of <(t>)>))

comparison<(of <(t>)>是一種泛型委託。所以,需要編寫乙個物件排序比較的方法,對list中的元素物件沒有特殊的要求,但在比

較方法中需要實現物件比較規則,這個方法實現後,就可以把這方名字作為引數委託給list的sort方法,sort方法在排序時會執行這個方法對list中的物件進行比較需要編寫乙個物件排序比較的方法,對list中的元素物件沒有特殊的要求,但在比較方法中需要實現物件比較規則,這個方法實現後,就可以把這方名字作為引數委託給list的sort方法,sort方法在排序時會執行這個方法對list中的物件進行比較

【解析:】第四種方法

4,帶有比較器引數,可以指定排序範圍的sort方法----sort(int32, int32 icomparer(t))

對於第四排序方法,實際是第二種比較器排序的乙個擴充套件,在指定排序比較器的同時,指定排序範圍,即list中準備排序的開始元素索引和結束元素索引

**********

很多人可能喜歡linq的orderby排序,可惜u3d裡面linq在ios上會報錯,所以就必須使用list的排序。

其實理解了並不難

sort有三種結果 1,-1,0分別是大,小,相等

公升序降序比較

預設list的排序是公升序排序

如果要降序排序,也很簡單,只需要在前面加乙個負號

list

> tmp = new

list

>();

tmp.sort((x, y) => -x.compareto(y));

console.writeline(tmp);

//22,11,5,4,1

對於非數值型別比較用.compareto(...),基於icomparable介面。基本上c#的值型別都有實現這個介面,包括string。

而數值型別也可以自己比較。排序時左右兩個變數必須是左-比較-右,切記不可反過來比較。

sort方法官方推薦的命名方式是x(左),y(右)。對於複雜的比較可以分出來,單獨寫成函式

多權重比較

假設需要tuple裡item2的值優先於item1。這個時候只要給比較結果*2即可。

listint

, int

>> tmp = new

listint

, int

>>()

;tmp.sort((x, y) => -(x.item1.compareto(y.item1) + x.item2.compareto(y.item2) * 2

));console.writeline(tmp);

//22,3

//1,2

//53,1

//12,1

//2,1

如果單獨對公升序降序控制,可以去掉大括號,分開進行配置

box shadow 詳解及示例

box shadow b ks do 英文示意 box 盒,包廂 shadow 陰影,漸變 定義 box shadow none inset?color 注 示例 1 配合border radius實現圓形陰影 box shadow 20px 10px 5px 0px grey border rad...

SQL注入詳解及示例

隨著b s模式應用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越多。但是由於這個行業的入門門檻不高,程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫 的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可以提交一段資料庫查詢 根據程式返回的結果,獲得某...

SQL注入詳解及示例

隨著b s模式應用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越多。但是由於這個行業的入門門檻不高,程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫 的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可以提交一段資料庫查詢 根據程式返回的結果,獲得某...