2009-11-01 2 views
29

Ich habe eine List<T>, wobei T eine Klasse ist, die eine Eigenschaft "Benutzername" verfügbar macht. Der Benutzername hat einen benutzerdefinierten Typ, der eine Zeichenfolge kapselt. Ich implementierte die IComparable<T> Schnittstelle auf diesem benutzerdefinierten Typ, der einfach zurückgibtFehler beim Vergleich zweier Elemente im Array

this.encapsulatedString.CompareTo(other.encapsulatedString) 

ich ein ICollectionView der Liste definierte so:

AllUsers=CollectionViewSource.GetDefaultView(myList); 

ich eine SortDescription hinzugefügt:

AllUsers.SortDescriptions.Add(new SortDescription("Username",ListSortDirection.Ascending)); 

Auf dieser Linie Der Code löst die im Titel angegebene Ausnahme aus. Ich kann die Liste auf andere Weise ohne Probleme sortieren. Woher kommt die Ausnahme?

Antwort

46

Stupidstupidstupid: Der benutzerdefinierte Typ hat IComparable auch zu implementieren, wie IComparable<T> Es ist die SortDescription scheint verwendet die altmodische nicht-generische Version von CompareTo

Ich werde einige dringend benötigte Schlaf ...

+0

Fühlen Sie sich frei, Ihre Frage zu schließen, wenn Sie möchten ... – Noldorin

+37

NEIN, nicht schließen. Jemand anderes könnte das gleiche Problem haben – erikkallen

+4

+1 Ja wie ich ... danke für die Offenhaltung. :-) –

0

Wie Sie gesagt haben, müssen Sie das nicht-generische IComparable implementieren. Sie können die Comparer <T> Klasse verwenden, wenn Sie diese Schnittstelle auf eine nette generische Weise implementieren möchten :)

4

Ihre Antwort ist nicht streng korrekt von dem, was ich sagen kann. Meine Objekte implementieren nicht IComarable oder IComparable überhaupt und sie funktionieren immer noch gut. Ich erstelle eine CollectionViewSource und sortiere Beschreibungen genau wie Sie und bekomme diesen Fehler nicht. Ich habe den Fehler erhalten, weil die Eigenschaft in der Sortierbeschreibung leer war. Sobald ich das behoben hatte, funktionierte alles ohne die Schnittstelle. Ich vermute, dass Sie eine Eigenschaft inkorrekt hatten und auf IComparable zurückgreifen, wenn sie nicht auf die Eigenschaft zugreifen kann.

5

In meinem Fall habe ich einen try/catch-Block innerhalb der Compare-Funktion hinzugefügt und die Ausnahme Message an der Konsole angezeigt. Wenn in Ihrer Vergleichsfunktion ein Fehler enthalten ist, erhalten Sie diese sekundäre Ausnahme ("Fehler beim Vergleich zweier Elemente ...").

Mein Problem war speziell mit der Indexierung auf Position 3 einer Zeichenfolge, die wegen eines anderen Fehlers "" war.

+1

Für mich wurde dies auch durch eine Ausnahme in der Compare-Funktion verursacht. –

0

In meinem Fall war die Eigenschaft, die sortiert wurde, object, und der Fehler trat auf, wenn einige der Objekte int s und andere string s waren.

ich IComparable implementiert haben könnte, aber die Verwendung der Klasse war wirklich mehr Schnur ausgerichtet - ich war in der Lage object-string zu ändern, und stellen Sie sicher, dass alle Setter Zahlen .ToString(), und es wurde ganz eingestellt, von dort aufgerufen mit .