2010-03-19 19 views
10

Mam klasy, która implementuje IComparable.C# - Jak zaimplementować wiele porównywarek dla klasy IComparable <T>?

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

    etc.. 
} 

I wtedy można wywołać metodę sortowania rodzajowe listy mojej klasie

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

c.Sort(); 

i mieć listę posortowaną według mojego comparer.

Jak określić dalszych porównywaczy, aby sortować moją kolekcję na różne sposoby, zgodnie z innymi właściwościami MyClass, aby umożliwić użytkownikom sortowanie mojej kolekcji na wiele różnych sposobów?

Odpowiedz

13

Aby ustawić porządek w swojej klasie:

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

Następnie do sortowania użyciu nowego porównania:

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

wyjątkiem wyraźnie nie chcą uporządkować pustą listę :)

+0

+1, chociaż możesz napisać to zwięźle wyrażeniem lambda :) –

+0

Awesome, thanks. –

+0

Kevin, walczę z tym przez 2 dni i nie mogę zrozumieć, co robi. Twoja metoda działa, ale w jaki sposób można by napisać tę statyczną metodę bez pisania jej jako "delegata"? – jp2code

9

Możesz wywołać Sort z użyciem określonego porównywalnika jako argumentu. Numer referencyjny: MSDN

+0

Podniosłem tę odpowiedź jako Kevin, ponieważ uważam, że oba są dobrymi rozwiązaniami. Użyłem tego rozwiązania, ponieważ uważam, że jest prostsze. itemDescription/ItemNumber: Dostarczyłem odpowiedź, która demonstruje moją implementację –

2

Jeśli masz wiele sposobów sortowania listy obiektów, musisz oczywiście wybrać, którą opcję wybrać. Oto, do czego służą inne przesłanianie Sortowania. Spójrz na IComparer and Comparison.

3

Jednym z kroków w tym kierunku byłoby użycie przeciążenia sortowania, które pozwala ci określić IComparer<T> (nie jest to jednak IComparable<T>).

Jeśli masz już dużo IComparable<T> wdrożeń, powinna ona być trywialne napisać realizację ogólnych celów IComparer<T> że porównuje dwa IComparable<T> instancji. W rzeczywistości jestem nieco zaskoczony, że taka klasa nie istnieje już w BCL, ale nie udało mi się jej znaleźć.

Comparer<T>.Default jest blisko, ale nie do końca.