打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C# 自定义实体类或集合的自动排序

          数据结构学了那么久,昨天晚上突然看见网上评测自己写的快速排序和.net自带的sort,结果竟然没有.net自带的快。这个结果让我一直喜欢自己写代码的人着实郁闷了把。所以研究了下.net自带的sort。

          今天就拿自己写的日程提醒为例来讲讲如何实现自动排序。

          首先,要想实现集合自动排序必须实现IComparable接口,接下来我们就按照提醒时间为我们日程排序。

 


 1     public class Appoint:IComparable<Appoint>
 2     {
 3         private DateTime _remindTime;
 4         private object _appointObject;
 5         public Appoint(DateTime dt,object appointment)
 6         {
 7             _remindTime = dt;
 8             _appointObject = appointment;
 9         }
10         public DateTime RemindTime
11         {
12             get { return _remindTime; }
13             set { _remindTime = value; }
14         }
15         public object AppointObject
16         {
17             get { return _appointObject; }
18             set { _appointObject = value; }
19         }
20         public bool RemoveCompare(Appoint other)
21         {
22             if (_remindTime.CompareTo(other._remindTime) == 0 && _appointObject == other._appointObject)
23                 return true;
24             return false;
25         }
26 
27         public override string ToString()
28         {
29             return string.Format("Remind time: {0}{1}Appointment:{2}{1}", _remindTime.ToString("yyyy-MM-dd hh:mm:ss"), Environment.NewLine, _appointObject.ToString());
30         }
31 
32         #region IComparable<Appoint> 成员
33 
34         public int CompareTo(Appoint other)
35         {
36             return _remindTime.CompareTo(other._remindTime);
37         }
38 
39         #endregion
40     }

 

          哈哈,因为是按照时间的,而DateTime类已经为我们实现了IComparable接口,所以只要在自己实现的类中返回时间的比较结果就可以了。

          这里给不幸要完全自己写ComapreTo方法的程序员一点提示,是摘自MSDN的

 

------------------我是无敌分割线-----------------

          此方法只是一个定义,必须由特定的类或值类型实现才能生效。“小于”、“等于”和“大于”这几种比较的含义取决于具体的实现。

          根据定义,任何对象与 空引用(在 Visual Basic 中为 Nothing) 相比较都要大,两个空引用的比较结果为彼此相等。

          给实现者的说明 对于对象 A、B 和 C,以下条件必须为真: A.CompareTo(A) 必须返回零。 如果 A.CompareTo(B) 返回零,则 B.CompareTo(A) 必须返回零。 如果 A.CompareTo(B) 返回零并且 B.CompareTo(C) 返回零,则 A.CompareTo(C) 必须返回零。 如果 A.CompareTo(B) 返回一个非零值,则 B.CompareTo(A) 必须返回符号相反的值。 如果 A.CompareTo(B) 返回一个不等于零的值 x,并且 B.CompareTo(C) 返回一个与 x 符号相同的值 y,则 A.CompareTo(C) 必须返回与 xy 都符号相同的值。

          给调用者的说明 使用 CompareTo 方法可确定类的实例的排序。

------------------我是无敌分割线-----------------

 

          回到正题,将上面的日程类写完后就能对日程类的集合实现自动排序了。何为自动排序,就是.Sort()->排好了,多轻松。我们来看看排序的代码。

          


1 class AppList
2 {
3         private List<Appoint> _ap;  //Appoint类的集合
4         public void AddAppoint(Appoint app) //像集合插入一个日程,并对所有日程重新排序
5         {
6             _ap.Add(app);//插入
7             _ap.Sort(); //排序
8         }
9 }

 

          一句_ap.Sort()搞定一切,多轻松。这里顺便告诉大家一个实现IComparable接口的另一个好处。要知道这里是插入一个日程后就重新排序。虽然快速排序很快,但是其最优实现也是N*lgN的时间消耗。与其每次插入,不如在插入的时候就按照顺序,这样就不用排序了。如果我们定义好了IComaprable接口,那么一切不用操心,SortedList<>泛型为你实现一切,如果读者有兴趣,可以参考CSDN的这篇文章(SortedList-asp.net入门笔记(七)),这里就不在赘述了。

          文章比较基础,高手勿怪,如果有错误敬请指正,谢谢。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
关于IComparable和IComparer接口 和 Comparer类
判断是几季度的算法
C#泛型详解
c# 接口代码实例
CLR 中的范型详解(转与MSDN)
C#3.0入门系列(六)-之OrderBy操作
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服