C# 自訂實體類或集合的自動排序

來源:互聯網
上載者:User

          資料結構學了那麼久,昨天晚上突然看見網上評測自己寫的快速排序和.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的

 

------------------我是無敵分割線-----------------

          此方法只是一個定義,必須由特定的類或實值型別實現才會生效。“小於”、“等於”和“大於”這幾種比較的含義取決於具體的實現。

          根據定義,任何對象與 Null 參考(在 Visual Basic 中為 Nothing) 相比較都要大,兩個Null 參考的比較結果為彼此相等。

          給實現者的說明 對於對象 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) 必須返回與 x 和 y 都符號相同的值。

          給調用者的說明 使用 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入門筆記(七)),這裡就不在贅述了。

          文章比較基礎,高手勿怪,如果有錯誤敬請指正,謝謝。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.