2010-03-19 10 views
10

Tengo una clase que implementa IComparable.C# - ¿Cómo implementar múltiples comparadores para una clase de IComparable <T>?

public class MyClass : IComparable<MyClass> 
{ 
    public int CompareTo(MyClass c) 
    { 
     return this.whatever.CompareTo(c.whatever); 
    } 

    etc.. 
} 

Entonces puede llamar al método especie de una lista genérica de mi clase

List<MyClass> c = new List<MyClass>(); 
//Add stuff, etc. 

c.Sort(); 

y tienen la lista ordenada de acuerdo a mi comparador.

¿Cómo especifico más comparadores para ordenar mi colección de diferentes maneras según las otras propiedades de MyClass para permitir a los usuarios ordenar mi colección de diferentes maneras?

Respuesta

13

Para configurar el tipo de su clase:

public static Comparison<MyClass> OtherComparison = delegate(MyClass object1, MyClass object2) 
{ 
    return object1.Whatever.CompareTo(object2.Whatever); 
}; 

A continuación, para ordenar el uso de su nueva comparación:

List<MyClass> myClassList = new List<MyClass>(); 
myClassList.Sort(MyClass.OtherComparison); 

Salvo que claramente no va a querer ordenar una lista vacía :)

+0

+1 aunque se puede escribir de forma más sucinta con una expresión lambda :) –

+0

Impresionante, gracias. –

+0

Kevin, he luchado con esto durante 2 días, y no puedo entender lo que está haciendo. Tu camino funciona, pero ¿cómo se escribiría este método estático sin escribirlo como "delegado"? – jp2code

9

Puede llamar Ordenar con un comparador específico como argumento. Referencia: MSDN

+0

He votado positivamente esta respuesta como Kevin porque creo que ambas son buenas soluciones. Usé esta solución porque creo que es más simple. itemDescription/ItemNumber: He proporcionado una respuesta que demuestra mi implementación –

2

Si tiene varias formas de ordenar una lista de sus objetos, obviamente debe especificar qué opción elegir. Para eso sirven las otras anulaciones de Sort. Eche un vistazo a IComparer y la comparación.

3

Un paso en esa dirección sería usar la sobrecarga Sort que permite especificar un IComparer<T> (no un , sin embargo).

Si ya tiene una gran cantidad de implementaciones IComparable<T>, debería ser trivial para escribir una aplicación de propósito general de IComparer<T> que compara dos IComparable<T> casos. De hecho, estoy un poco sorprendido de que dicha clase no exista ya en el BCL, pero no he podido encontrarla.

Comparer<T>.Default se acerca, pero no del todo.

Cuestiones relacionadas