惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
GbyAI
GbyAI
G
Google Developers Blog
Engineering at Meta
Engineering at Meta
月光博客
月光博客
腾讯CDC
Recent Announcements
Recent Announcements
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
SegmentFault 最新的问题
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
阮一峰的网络日志
阮一峰的网络日志
博客园 - 【当耐特】
The GitHub Blog
The GitHub Blog
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
aimingoo的专栏
aimingoo的专栏
Google DeepMind News
Google DeepMind News
Y
Y Combinator Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Martin Fowler
Martin Fowler
A
About on SuperTechFans
博客园 - 叶小钗

博客园 - 暴风雨

新开发的网站,小熊礼品网 w3c 检查 怎样利用网络来扩大幼儿园的影响力? 幼教网址大全 免费幼儿园网站 打靶问题 使用Google Search API 怎样在Exe间传递参数 .Net开发中的设计问题和构架 构建模式—单例模式 用C#实现MVC(Model View Control)模式介绍 以前的作业:八皇后问题求解 C++写的一个读取CSV文件的函数 尝试概要设计的写法 今天游泳很高兴 每天进步一点点 自己写的一个VB.netDB操作类 .NET Framework 自动内存管理机制深入剖析 (C#分析篇)[转] 深秋夜自嘲
用IComparable来实现可排序的集合
暴风雨 · 2005-12-28 · via 博客园 - 暴风雨

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();

原文页面有代码下载。