2011-04-15 141 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; 
    } 
}