.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...