作者:Mahesh Chand
原文地址:http://www.c-sharpcorner.com/UploadFile/mahesh/SortableArrays10212005115603AM/SortableArrays.aspx?ArticleID=d374d179-08e9-4473-b7e4-1991fad8affa
.NET Framework类库中提供了几个支持在集合中有追加功能的接口,比如:ICollection,IList和IComparable。
实现 IComparable
IComparable接口用来支持在集合中排序。它有一个函数——CompareTo。当你设计分类对象时,你必须实现IComparable的CompareTo方法。
比如,我做一个Developer类来继承IComparable。

public class Developer : IComparable
{
}
现在我来实现ComparaTo方法如下:

public int CompareTo( object obj)
{
// Some code here
}
现在我们说,Developer类有一个属性叫ID,而你希望你的这些项目按照ID来排序,我们简单的加入如下代码:

public int CompareTo( object obj)

{
if( !(obj is Developer) )
throw new InvalidCastException("Not a valid Developer object.");
Developer developer = (Developer)obj;
return this.ID.CompareTo(developer.ID);
}
正如你所看到的上面的代码,它来比较当前对象的值和新值作比较。
现在我们说,Developer对象还有其他公有属性:FirstName,LastName,Age以及Experience,并且你想用它们中的任意一个来分类。
为了做到这点,我们定义一个枚举:

public enum SortFilter

{
FirstName,
LastName,
Age,
Experience
}
然后,我在Developer类中加入一个静态属性SortFilter:

private static SortFilter sortingBy = SortFilter.FirstName;

public static SortFilter SortingBy
{
get
{ return sortingBy; }
set
{ sortingBy = value; }
}
现在我修改ComparaTo方法如下:

public int CompareTo( object obj)
{
if( !(obj is Developer) )
throw new InvalidCastException("Not a valid Developer object.");
Developer developer = (Developer)obj;
switch(Developer.SortingBy)
{
case SortFilter.FirstName:
return this.FirstName.CompareTo(developer.FirstName);
case SortFilter.LastName:
return this.LastName.CompareTo(developer.LastName);
case SortFilter.Age:
return this.Age.CompareTo(developer.Age);
case SortFilter.Experience:
return this.Experience.CompareTo(developer.Experience);
default:
goto case SortFilter.FirstName;
}
}

正如你所看到的上面的代码,我为每一个分类条件加入一个case语句。现在我的类准备好了支持排序。所有我做的工作是:建立一个Developer对象的ArrayList,设置分类过滤器(SortFilter),调用Sort方法。
下面的代码生成一个Developer类型的ArrayList:

private ArrayList GetList()
{
ArrayList list = new ArrayList();
list.Add(new Developer("Mahesh", "Chand", 30, "C#,ASP.NET,Windows Forms", 10)) ;
list.Add(new Developer("Michael", "Gold", 35, "GDI+, ASP.NET", 15)) ;
list.Add(new Developer("Bhasker", "Das", 26, "VB.NET, Web Applications", 4)) ;
list.Add(new Developer("Ashish", "Singhal", 24, "ADO.NET, GDI+", 4)) ;
list.Add(new Developer("Neel", "Beniwal", 3, "C#,ASP.NET,Windows Forms", 0)) ;
list.Add(new Developer("Melanie", "Talmadge", 25, "Java", 2)) ;
return list;
}

下面的代码设置以"FirstName"来分类,调用ArrayList的Sort方法。现在ArrayList将返回分类结果。

ArrayList list = GetList();

Developer.SortingBy = (SortFilter)Enum.Parse( typeof (SortFilter), " FirstName " );

list.Sort();
排序顺序
现在你可能还要在你的对象中加入排序的顺序(升序还是降序)。为了完成这个,我加入一个SortOrder枚举:

public enum SortOrder
{
Ascending,
Descending
}
我也在Developer类中加入静态属性SortingOrder如下:

private static SortOrder sortingOrder = SortOrder.Ascending;

public static SortOrder SortingOrder
{
get
{ return sortingOrder; }
set
{ sortingOrder = value; }
}
我将CompareTo方法改成如下。正如你从这个函数中看到,现在我来检测SortingOrder是Ascending还是Descending来根据要排序的属性排序。

public int CompareTo( object obj)
{
if( !(obj is Developer) )
throw new InvalidCastException("Not a valid Developer object.");
Developer developer = (Developer)obj;
switch(Developer.SortingBy)
{
case SortFilter.FirstName:
if (Developer.sortingOrder == SortOrder.Ascending)
return this.FirstName.CompareTo(developer.FirstName);
else return developer.FirstName.CompareTo(this.FirstName);
case SortFilter.LastName:
if (Developer.sortingOrder == SortOrder.Ascending)
return this.LastName.CompareTo(developer.LastName);
else return developer.LastName.CompareTo(this.LastName);
case SortFilter.Age:
if (Developer.sortingOrder == SortOrder.Ascending)
return this.Age.CompareTo(developer.Age);
else return developer.Age.CompareTo(this.Age);
case SortFilter.Experience:
if (Developer.sortingOrder == SortOrder.Ascending)
return this.Experience.CompareTo(developer.Experience);
else return developer.Experience.CompareTo(this.Experience);
default:
goto case SortFilter.FirstName;
}
}
现在需要做的就是,将SortingOrder属性加入Developer对象中,调用Sort函数。

Developer.SortingOrder = (SortOrder)Enum.Parse( typeof (SortOrder), " Descending " );

list.Sort();

原文页面有代码下载。
转载于:https://www.cnblogs.com/c-delight/archive/2005/12/28/306621.html