諸如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對於非數值型別比較用.compareto(...),基於icomparable介面。基本上c#的值型別都有實現這個介面,包括string。> tmp = new
list
>();
tmp.sort((x, y) => -x.compareto(y));
console.writeline(tmp);
//22,11,5,4,1
而數值型別也可以自己比較。排序時左右兩個變數必須是左-比較-右,切記不可反過來比較。
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模式應用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越多。但是由於這個行業的入門門檻不高,程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫 的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可以提交一段資料庫查詢 根據程式返回的結果,獲得某...