2011-04-15 19 views
8

Me he hecho un lector de RSS que me mantiene actualizado y me informa sobre nuevos programas, o al menos eso es lo que está detrás.¿Sobrecarga del operador?

He hecho una estructura "SeasonEpisode" que contiene dos ints (season + episode) y una función OverSide de ToString.

Guardo lo último visto localmente y luego leo cuál es el más nuevo del rss. Pero, ¿cómo podría comparar SeasonEpisodes? en este momento tomo cada uno de los enteros y compararlos

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

lo que realmente quiero es

if(se1 > se2) 
    // new episode 

podría conseguir cualquier ayuda por favor?

Respuesta

26

Hay dos maneras:

  1. Implementar IComparable<T> y utilizar CompareTo
  2. Overload the greater and less than operators

Sugiero, se utiliza en ambos sentidos:

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

Los operadores lanzar una '' NullReferenceException' en caso de e1' es 'null' . – BatteryBackupUnit

+0

@BatteryBackupUnit Eso es correcto. Gracias por [su corrección] (http://stackoverflow.com/a/32481449/572644). –

1

se puede implementar el IComparer<T> interfaz

Define un método que un tipo implementa para comparar dos objetos.

Puede implementar IComparable si quieres una clase para ser comparables a otra instancia de esa clase. Que es probablemente lo que quieres, en este caso.

Implemente IComparer si necesita una clase que compara dos objetos.

+0

(En términos de la versión anterior de su respuesta, la edición de su respuesta no cambió la noción de mi comentario. Demasiado perezoso para volver a escribir ...) Esa no es realmente la interfaz correcta para usar aquí. Necesitaría una clase comparadora que implemente esta interfaz o la implemente en 'SeasonEpisode' y llámela así:' se1.Compare (se1, se2) '. Un poco incómodo. 'IComparable ' es lo que quiere usar aquí. Ver también: http://stackoverflow.com/questions/538096/when-to-use-icomparablet-vs-icomparert –

2

Al tropezar con un NullReferenceException, aquí hay una mejora (bueno, esto puede ser subjetivo ;-)) a Daniel Hilgarth's answer.

El único cambio es que se maneja null s en caso de que el primer argumento al operador > o < es nulo:

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; 
    } 
}