用IComparable来实现可排序的集合

作者: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。

None.gif public   class  Developer : IComparable
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedBlockEnd.gif}

现在我来实现ComparaTo方法如下:

None.gif public   int  CompareTo( object  obj)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
// Some code here
ExpandedBlockEnd.gif
}

现在我们说,Developer类有一个属性叫ID,而你希望你的这些项目按照ID来排序,我们简单的加入如下代码:

None.gif public   int  CompareTo( object  obj)
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif      
if!(obj is Developer) )
InBlock.gif
InBlock.gif            
throw new InvalidCastException("Not a valid Developer object.");
InBlock.gif
InBlock.gif      Developer developer 
= (Developer)obj; 
InBlock.gif
InBlock.gif      
return this.ID.CompareTo(developer.ID);                              
InBlock.gif
ExpandedBlockEnd.gif}

正如你所看到的上面的代码,它来比较当前对象的值和新值作比较。

现在我们说,Developer对象还有其他公有属性:FirstName,LastName,Age以及Experience,并且你想用它们中的任意一个来分类。

为了做到这点,我们定义一个枚举:

None.gif public   enum  SortFilter
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif      FirstName,
InBlock.gif
InBlock.gif      LastName,
InBlock.gif
InBlock.gif      Age,
InBlock.gif
InBlock.gif      Experience
InBlock.gif
ExpandedBlockEnd.gif}

然后,我在Developer类中加入一个静态属性SortFilter:

None.gif private   static  SortFilter sortingBy  =  SortFilter.FirstName; 
None.gif
public   static  SortFilter SortingBy
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif      
get dot.gifreturn sortingBy; }
ExpandedSubBlockStart.gifContractedSubBlock.gif      
set dot.gif{ sortingBy = value; }
ExpandedBlockEnd.gif}

现在我修改ComparaTo方法如下:

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

ExpandedBlockEnd.gif}

None.gif

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

下面的代码生成一个Developer类型的ArrayList:
None.gif private  ArrayList GetList()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif      ArrayList list 
= new ArrayList();
InBlock.gif      list.Add(
new Developer("Mahesh""Chand"30"C#,ASP.NET,Windows Forms"10)) ; 
InBlock.gif      list.Add(
new Developer("Michael""Gold"35"GDI+, ASP.NET"15)) ; 
InBlock.gif      list.Add(
new Developer("Bhasker""Das"26"VB.NET, Web Applications"4)) ; 
InBlock.gif      list.Add(
new Developer("Ashish""Singhal"24"ADO.NET, GDI+"4)) ; 
InBlock.gif      list.Add(
new Developer("Neel""Beniwal"3"C#,ASP.NET,Windows Forms"0)) ; 
InBlock.gif      list.Add(
new Developer("Melanie""Talmadge"25"Java"2)) ; 
InBlock.gif      
return list;
ExpandedBlockEnd.gif}

None.gif

下面的代码设置以"FirstName"来分类,调用ArrayList的Sort方法。现在ArrayList将返回分类结果。
None.gif ArrayList list  =  GetList();
None.gifDeveloper.SortingBy 
=  (SortFilter)Enum.Parse( typeof (SortFilter),  " FirstName " );
None.giflist.Sort();

排序顺序

现在你可能还要在你的对象中加入排序的顺序(升序还是降序)。为了完成这个,我加入一个SortOrder枚举:
None.gif public   enum  SortOrder
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif      Ascending,
InBlock.gif      Descending
ExpandedBlockEnd.gif}

我也在Developer类中加入静态属性SortingOrder如下:
None.gif private   static  SortOrder sortingOrder  =  SortOrder.Ascending;
None.gif
public   static  SortOrder SortingOrder
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif      
get dot.gifreturn sortingOrder; }
ExpandedSubBlockStart.gifContractedSubBlock.gif      
set dot.gif{ sortingOrder = value; }
ExpandedBlockEnd.gif}

我将CompareTo方法改成如下。正如你从这个函数中看到,现在我来检测SortingOrder是Ascending还是Descending来根据要排序的属性排序。

None.gif public   int  CompareTo( object  obj)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif      
if!(obj is Developer) )
InBlock.gif            
throw new InvalidCastException("Not a valid Developer object."); 
InBlock.gif      Developer developer 
= (Developer)obj; 
InBlock.gif      
switch(Developer.SortingBy)
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif            
case SortFilter.FirstName: 
InBlock.gif                  
if (Developer.sortingOrder == SortOrder.Ascending)
InBlock.gif                      
return this.FirstName.CompareTo(developer.FirstName);
InBlock.gif                  
else return developer.FirstName.CompareTo(this.FirstName);
InBlock.gif            
case SortFilter.LastName: 
InBlock.gif                  
if (Developer.sortingOrder == SortOrder.Ascending)
InBlock.gif                        
return this.LastName.CompareTo(developer.LastName);
InBlock.gif                  
else return developer.LastName.CompareTo(this.LastName);
InBlock.gif            
case SortFilter.Age: 
InBlock.gif                  
if (Developer.sortingOrder == SortOrder.Ascending)
InBlock.gif                        
return this.Age.CompareTo(developer.Age);
InBlock.gif                  
else return developer.Age.CompareTo(this.Age);
InBlock.gif            
case SortFilter.Experience:
InBlock.gif                  
if (Developer.sortingOrder == SortOrder.Ascending)
InBlock.gif                        
return this.Experience.CompareTo(developer.Experience);
InBlock.gif                  
else return developer.Experience.CompareTo(this.Experience);
InBlock.gif            
default:
InBlock.gif                  
goto case SortFilter.FirstName;
ExpandedSubBlockEnd.gif      }

ExpandedBlockEnd.gif}

现在需要做的就是,将SortingOrder属性加入Developer对象中,调用Sort函数。
None.gif Developer.SortingOrder  =  (SortOrder)Enum.Parse( typeof (SortOrder),  " Descending " );
None.giflist.Sort();
None.gif

原文页面有代码下载。

转载于:https://www.cnblogs.com/c-delight/archive/2005/12/28/306621.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值