c 范型List的Sort方法詳解

2021-07-29 19:32:41 字數 4985 閱讀 8016

.net2005中的范型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()方法中要自己實現物件的比較規則。詳細可以參照如下**:

using

system;

using

system.collections.generic;

using

system.text;

namespace

comparer.sortobject

#region 屬性定義

public

intcode

get}

public

string

name

get}

#endregion

#region 實現比較介面的compareto方法

public

intcompareto(

object

obj)

elseif(

this

.code < sobj.code)

}catch

(exception ex)

return

res;

}#endregion}}

第二種帶有比較器引數的sort方法,list中的元素物件不需要繼承icomparable介面,但需要額外建立乙個物件的比較器,下面的**中的sorttestobj2類是準備要儲存到范型list中的物件,sorttestobj2camparer 類則是sorttestobj2類的比較器,這個比較起必須繼承icomparer介面,並且實現介面中的compare()方法。詳細做法可參照下面的**。

sorttestobj2類

using

system;

using

system.collections.generic;

using

system.text;

namespace

comparer.sortobject

#region 屬性定義

public

intcode

get}

public

string

name

get}

#endregion}}

sorttestobj2camparer類

using

system;

using

system.collections.generic;

using

system.text;

using

comparer.sortobject;

namespace

comparer.camparer

/// 

/// sorttestobj2類排序用的比較器,繼承icomparer<>介面,

/// 實現介面中的compare()方法。

/// 

public

class

sorttestobj2camparer : icomparer

#endregion

#region icomparer介面比較方法的實現

public

intcompare(sorttestobj2 obj1, sorttestobj2 obj2)

else

if((obj1 != 

null

) && (obj2 == 

null

))else

if((obj1 == 

null

) && (obj2 != 

null

))if

(sortkind == obj2sortkind.code)

else

if(obj1.code < obj2.code)

}else

if(sortkind == obj2sortkind.name)

return

res;

}#endregion}}

第三種方法需要編寫乙個物件排序比較的方法,對list中的元素物件沒有特殊的要求,但在比較方法中需要實現物件比較規則,這個方法實現後,就可以把這方名字作為引數委託給list的sort方法,sort方法在排序時會執行這個方法對list中的物件進行比較,詳細可參照下面的**。對list中元素我們還使用上面的sorttestobj2類物件。

static

void

main(

string

args)

//sort(comparison<(of <(t>)>))方法排序,這中方法需要先編寫乙個物件比較的方法,然後

//把這個比較方法委託給list的sort方法。

//物件比較的方法

private

static

intsorttestobj2compare(sorttestobj2 obj1, sorttestobj2 obj2)

else

if((obj1 != 

null

) && (obj2 == 

null

))else

if((obj1 == 

null

) && (obj2 != 

null

))if

(obj1.code > obj2.code)

else

if(obj1.code < obj2.code)

return

res;

}//list的委託排序

private

static

void

delegatesort()

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

//按name進行排序

sorttestobj2camparer namecmp = 

newsorttestobj2camparer(obj2sortkind.name);

objlst.sort(1, 3, namecmp);

下面的**是對上面介紹的四種方法的進行測試的**,可以結合上面**建立乙個控制台工程體會一下。

using

system;

using

system.collections.generic;

using

system.text;

using

comparer.sortobject;

using

comparer.camparer;

namespace

comparer

//sort()方法排序

private

static

void

lstsort()

}//sort(icomparer(t))方法排序

private

static

void

lstcomparersort()

//按name進行排序

sorttestobj2camparer namecmp = 

newsorttestobj2camparer(obj2sortkind.name);

objlst.sort(namecmp);

console.writeline(

"按name排序的結果"

);foreach

(sorttestobj2 item 

inobjlst)

}//sort(int32, int32 icomparer(t))排序,指定list中排序的開始元素和終了元素

private

static

void

lstfromtosort()

//按name進行排序

sorttestobj2camparer namecmp = 

newsorttestobj2camparer(obj2sortkind.name);

objlst.sort(1, 3, namecmp);

console.writeline(

"按name排序的結果"

);foreach

(sorttestobj2 item 

inobjlst)

}//sort(comparison<(of <(t>)>))方法排序,這中方法需要先編寫乙個物件比較的方法,然後

//把這個比較方法委託給list的sort方法。

//物件比較的方法

private

static

intsorttestobj2compare(sorttestobj2 obj1, sorttestobj2 obj2)

else

if((obj1 != 

null

) && (obj2 == 

null

))else

if((obj1 == 

null

) && (obj2 != 

null

))if

(obj1.code > obj2.code)

else

if(obj1.code < obj2.code)

return

res;

}//list的委託排序

private

static

void

delegatesort()}}

}

關於List的sort方法

我喜歡簡單,不喜歡囉嗦,直切主題,廢話不說。list 排序提供了很多的方法,較早的時候使用的方法是在例項型別上實現icomparable介面的compareto方法,還可以單獨寫乙個類來實現icompare介面的compare方法。有了linq之後就簡單多了,不在需要使用lsit.sort new ...

STL中關於list容器的sort函式詳解

因為在stl中stl algo中提供有sort函式,他的函式原型 template inline void sort randomaccessiterator first,randomaccessiterator last template inline void sort randomaccess...

C 泛型 使用委託的Sort排序方法

泛型的排序有3種方法,分別是 1 list.sort 只能在集合元素實現了icomparable泛型介面時使用 2 list.sort comparison comparison是乙個方法委託,它帶有2個引數t,返回int型別,可以靈活指定如何排序,但是需要編碼時手動指定如何排序 3 list.so...