代码阅读总结之ASP.NET StartKit TimeTracker(自定义集合类排序(Sort())方法随笔)...

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 

我的系列文章
A.Sql Server2005 Transact-SQL 新兵器学习 
B.MCAD学习 
C.代码阅读总结 
D.ASP.NET状态管理 
E.DB(数据库) 
F.WAP 
G.WinForm 
H.Flex

我的好文推荐
FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统((Flex,Fms3联合开发))<视频聊天,会议开发实例8> 
Sql Server2005 Transact-SQL 新兵器学习总结之-总结 
MS SQL数据库备份和恢复存储过程(加强版本) 
sql server中分布式查询随笔(链接服务器(sp_addlinkedserver)和远程登录映射(sp_addlinkedsrvlogin)使用小总结) 
ASP.NET2.0国际化/本地化应用程序的实现总结(多语言,多文化页面的实现) 
WAP开发资料站(最新更新) 
自定义格式字符串随笔 (IFormattable,IFormatProvider,ICustomFormatter三接口的实现) 
Mcad学习笔记之异步编程(AsyncCallback 委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结) 
Mcad学习笔记之通过反射调用類的方法,屬性,字段,索引器(2種方法) 
Mcad学习笔记之序列化(2进制和Soap序列 化) 
Mcad学习笔记之委托再理解(delegate的构造器,BeginInvoke,EndInvoke,Invoke4个方法的探讨) 
ASP.NET状态管理之一(概括篇) 
Flex,Fms学习笔记



本文转自aierong博客园博客,原文链接:http://www.cnblogs.com/aierong/archive/2005/03/14/118402.html,如需转载请自行联系原作者
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值