2009-11-01 2 views
29

У меня есть List<T>, где T - это класс, который предоставляет свойство «Username». Имя пользователя имеет настраиваемый тип, который инкапсулирует строку. Я реализовал интерфейс на этом пользовательский тип, который просто возвращаетНе удалось сравнить два элемента в массиве

this.encapsulatedString.CompareTo(other.encapsulatedString) 

Я определил ICollectionView Перечня таким образом IComparable<T>:

AllUsers=CollectionViewSource.GetDefaultView(myList); 

Я добавил Sortdescription:

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

На этой линии код генерирует исключение, указанное в заголовке. Я могу сортировать список другими способами без проблем. Откуда возникает исключение?

ответ

46

Stupidstupidstupid: Пользовательский тип должен реализовывать IComparable, а также IComparable<T> Кажется, SortDescription использует старомодный необщего версии CompareTo

Я собираюсь получить столь необходимый сон ...

+0

Не стесняйтесь, если вы хотите, закрыть свой вопрос ... – Noldorin

+37

НЕТ, не закрывайте. Кто-то может столкнуться с одной и той же проблемой. – erikkallen

+4

+1 Да, как я ... спасибо за то, что он открыт. :-) –

0

Как вы сказали, вам необходимо реализовать не общий код IComparable. Вы можете использовать класс сравнения <T>, если вы хотите реализовать этот интерфейс в общем общем виде.

4

Ваш ответ не совсем корректен из того, что я могу сказать. Мои объекты не реализуют IComarable или IComparable вообще, и они все еще работают нормально. Я создаю CollectionViewSource и добавляю описания сортировки так же, как вы, и не получаю эту ошибку. Я получил ошибку, потому что свойство в описании сортировки было пустым. Как только я исправил это, все отлично работало без интерфейса. Я подозреваю, что у вас некорректная собственность, и она возвращается к использованию IComparable, если она не может получить доступ к свойству.

5

В моем случае я добавил блок try/catch внутри функции Compare и отобразил сообщение об исключении на консоль. Если в вашей функции сравнения есть ошибка, вы получите это вторичное исключение («Не удалось сравнить два элемента ...»).

Моя проблема была связана с индексированием позиции 3 строки, которая была "" из-за другой ошибки.

+1

Для меня это также было вызвано исключением внутри функции Compare. –

0

В моем случае имущество, которое сортировалось, было object, и ошибка произошла, когда некоторые из объектов были int s и другие были string s.

Я мог бы реализовать IComparable, но использование класса было действительно более струна ориентирована - я был в состоянии изменить object к string, и убедитесь, что все сеттера с помощью набранных номеров .ToString(), и все это было установлено оттуда ,

Смежные вопросы