ASP.NET StartKit TimeTracker中定義了很多自訂集合類
例如:
UsersCollection
TimeEntriesCollection
等等
他們都是ArrayList類的子類
例如:
TimeEntriesCollection存放自訂類TimeEntry
這些自訂集合類都實現了排序方法Sort
先看我寫的一段代碼:
using System;
using System.Collections;
namespace ArrayListSort
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
ArrayList a=new ArrayList(8);
a.Add(111);
a.Add(2);
a.Sort();
IEnumerator iEnumerator=a.GetEnumerator();
while( iEnumerator.MoveNext() )
{
Console.WriteLine(iEnumerator.Current.ToString() );
}
ArrayList b=new ArrayList(8);
b.Add(new class2("wo"));
b.Add( new class2("ai"));
b.Add( new class2("i"));
b.Sort();
IEnumerator iiEnumerator=b.GetEnumerator();
while( iiEnumerator.MoveNext() )
{
Console.WriteLine(((class2)iiEnumerator.Current).A );
}
Console.ReadLine();
}
}
public class class2
{
public class2( string str)
{
this.a=str;
}
string a;
public string A
{
get
{
return a;
}
}
}
}
運行結果是
a的排序結果出來了
b的排序出現了錯誤
為什麼會出現這樣的結果?
ArrayList的Sort方法是利用了介面IComparable來進行的排序
這就是說ArrayList中的每個對象需要實現IComparable介面
int,string等系統已定義類型已經實現了IComparable介面
a.Sort()方法運行是正確的
b.Sort();由於沒有實現IComparable介面出現錯誤
現在修改class2代碼,程式就可以正確運行
public class class2:IComparable
{
public class2( string str)
{
this.a=str;
}
string a;
public string A
{
get
{
return a;
}
}
public int CompareTo(object o)
{
return this.A.CompareTo( ((class2)o).A );
}
}
其實還有一種方法實現排序
利用Sort(IComparer)
定義類實現介面System.Collections.IComparer
代碼如下:
public class class2_sort:System.Collections.IComparer
{
//是否為升序
bool isAsc;
//預設排序方式為升序
public class2_sort()
{
isAsc=true;
}
public class2_sort(bool b)
{
isAsc=b;
}
public int Compare(object x ,object y)
{
if (isAsc)
{
//升序
return ((class2)x).A.CompareTo(((class2)y).A);
}
else
{
//降序
return ((class2)y).A.CompareTo(((class2)x).A);
}
}
}
b.Sort( new class2_sort(false));
就可以實現降循序排序
個人覺得此方法靈活性高
推薦使用
小總結:
1.若要對自己的對象的數組進行排序,請在該對象上實現 IComparable 介面。
必須在該對象中定義一個 CompareTo 方法,以指定比較該對象的方式。
2.若要定義比較對象的特定方式,請建立一個實現了 IComparer 介面的類。
在該類中,必須包含一個 Compare 方法,該方法可接受要比較的兩個對象。
它有助於您瞭解想要比較對象的方式以及允許哪些對象使用所定義的介面。
希望上面提到的知識對你有所提示
當然歡迎交流和指正
author:aierong
blog:http://www.cnblogs.com/aierong
email:aierong@126.com