用IComparable来实现可排序的集合(作者:Mahesh Chand)

  .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();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值