2011-04-15 138 views
8

我爲自己做了一個rss閱讀器,讓我保持最新狀態,並通知我新的節目,或至少這是背後的想法。運算符重載?

我做了一個結構「SeasonEpisode」,它包含兩個整數(季節+劇集)和覆蓋ToString函數。

我存儲本地觀看的最新內容,然後從rss讀取最新內容。但是我怎麼能比較SeasonEpisodes?現在我把每一個整數的和比較它們

if(se1.Season >= se2.Season) 
    if(se1.Episode > se2.Episode || se1.Season > se2.Season) 
     // new episode! 

我真正想要的是

if(se1 > se2) 
    // new episode 

我能得到任何幫助嗎?

回答

26

有兩種方式:

  1. 實施IComparable<T>和使用CompareTo
  2. Overload the greater and less than operators

我建議,你用兩種方式:

public class SeasonEpisode : IComparable<SeasonEpisode> 
{ 
    public int CompareTo(SeasonEpisode other) 
    { 
     if(other == null) 
      return 1; 
     if(Season == other.Season) 
     { 
      if(Episode == other.Episode) 
       return 0; 
      else if(Episode < other.Episode) 
       return -1; 
      else 
       return 1; 
     } 
     else if(Season < other.Season) 
      return -1; 
     else 
      return 1; 
    } 

    public static bool operator <(SeasonEpisode e1, SeasonEpisode e2) 
    { 
     return e1.CompareTo(e2) < 0; 
    } 

    public static bool operator >(SeasonEpisode e1, SeasonEpisode e2) 
    { 
     return e1.CompareTo(e2) > 0; 
    } 
} 
+1

的運營商的情況下,拋出一個''NullReferenceException'是e1''null' 。 – BatteryBackupUnit 2015-09-09 13:29:12

+0

@BatteryBackupUnit這是正確的。感謝您[更正](http://stackoverflow.com/a/32481449/572644)。 – 2015-09-09 14:18:35

1

您可以實現IComparer<T>界面

定義一個類型實現的方法來比較兩個對象。

,如果你想一類具有可比性到另一個類的實例,您可以實現IComparable。在這種情況下,這可能是你想要的。

執行IComparer如果您需要一個類比較兩個對象

+0

(對於舊版本的答案,儘管對答案的修改並未改變我評論的概念,但是,懶得重新評論......)這不是真正的在這裏使用的正確界面。您可能需要一個實現此接口的比較器類,或者在'SeasonEpisode'中實現它,並像這樣調用它:'se1.Compare(se1,se2)'。有點尷尬。 'IComparable '是你想在這裏使用的。另見:http://stackoverflow.com/questions/538096/when-to-use-icomparablet-vs-icomparert – 2011-04-15 06:21:50

2

當我絆倒NullReferenceException時,這裏有一個改進(這個可能是主觀的;-))到Daniel Hilgarth's answer

唯一的變化是,它在處理的情況下null S中的第一個參數><經營者爲空:

public class SeasonEpisode : IComparable<SeasonEpisode> 
{ 
    private static int Compare(SeasonEpisode e1, SeasonEpisode e2) 
    { 
     if (e1 == null && e2 == null) 
      return 0; 
     else if (e1 == null) 
      return -1; 
     else if (e2 == null) 
      return 1; 

     if(e1.Season == e2.Season) 
     { 
      if(e1.Episode == e2.Episode) 
       return 0; 
      else if(e1.Episode < e2.Episode) 
       return -1; 
      else 
       return 1; 
     } 
     else if(e1.Season < e2.Season) 
      return -1; 
     else 
      return 1; 
    }  

    public int CompareTo(SeasonEpisode other) 
    { 
     return Compare(this, other); 
    } 

    public static bool operator <(SeasonEpisode e1, SeasonEpisode e2) 
    { 
     return Compare(e1, e2) < 0; 
    } 

    public static bool operator >(SeasonEpisode e1, SeasonEpisode e2) 
    { 
     return Compare(e1, e2) > 0; 
    } 
}