2009-11-01 23 views
29

Mam List<T> gdzie T jest klasą, która ujawnia właściwość "Nazwa użytkownika". Nazwa użytkownika jest niestandardowego typu, który hermetyzuje ciąg znaków. I wdrożone interfejsu IComparable<T> tego niestandardowego typu, które po prostu zwracaNie można porównać dwóch elementów w tablicy

this.encapsulatedString.CompareTo(other.encapsulatedString) 

ja zdefiniował ICollectionView z listy tak:

AllUsers=CollectionViewSource.GetDefaultView(myList); 

Dodałem Sortdescription:

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

Na tej linii kod zgłasza wyjątek podany w tytule. Mogę sortować listę w inny sposób bez problemu. Skąd się bierze wyjątek?

Odpowiedz

46

Stupidstupidstupid: Typ niestandardowy musi wdrożyć IComparable jak IComparable<T> Wydaje się SortDescription używa starej nierodzajową wersję CompareTo

mam zamiar trochę tak potrzebnego snu ...

+0

Możesz zamknąć swoje pytanie, jeśli chcesz ... – Noldorin

+37

NIE, nie zamykaj. Ktoś inny może wpaść na ten sam problem. – erikkallen

+4

+1 Tak jak ja ... dzięki, że go otworzyłeś. :-) –

0

Tak jak powiedziałeś, musisz zaimplementować nietypowy IComparable. Możesz użyć klasy Comparer <T>, jeśli chcesz zaimplementować ten interfejs w przyjemny ogólny sposób :)

4

Twoja odpowiedź nie jest całkowicie poprawna, co mogę powiedzieć. Moje obiekty nie implementują IComarable ani IComparable w ogóle i nadal działają dobrze. Tworzę CollectionViewSource i dodaje opisy sortowania tak jak ty i nie otrzymujesz tego błędu. Wystąpił błąd, ponieważ właściwość w opisie sortowania była pusta. Kiedy to naprawiłem, wszystko działało bez interfejsu. Podejrzewam, że być może masz nieprawidłową właściwość i powraca do korzystania z IComparable, jeśli nie może uzyskać dostępu do nieruchomości.

5

W moim przypadku dodałem blok try/catch w funkcji Compare i wyświetliłem komunikat wyjątku do konsoli. Jeśli w funkcji porównania wystąpi błąd, otrzymasz wtórny wyjątek ("Nie można porównać dwóch elementów ...").

Mój problem polegał na indeksowaniu pozycji 3 łańcucha, który był "" z powodu innego błędu.

+1

Dla mnie było to również spowodowane przez wyjątek wewnątrz funkcji Porównaj. –

0

W moim przypadku właściwość jest sortowana na object, a błąd wystąpił, gdy niektóre z obiektów były int s i inne były string s.

Mogłem realizowane IComparable, ale korzystanie z klasy był naprawdę bardziej nastawione ciąg - Udało mi się zmienić object do string i upewnij się, że wszystkie ustawiaczy za pomocą numerów, .ToString() i wszystko było ustawione stamtąd .

Powiązane problemy