Не удалось сравнить два элемента в массиве - PullRequest
30 голосов
/ 02 ноября 2009

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

this.encapsulatedString.CompareTo(other.encapsulatedString)

Я определил ICollectionView Списка таким образом:

AllUsers=CollectionViewSource.GetDefaultView(myList);

Я добавил Sortdescription:

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

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

Ответы [ 5 ]

50 голосов
/ 02 ноября 2009

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

Я собираюсь поспать ...

5 голосов
/ 14 января 2012

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

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

5 голосов
/ 24 мая 2011

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

0 голосов
/ 08 сентября 2016

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

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

0 голосов
/ 02 ноября 2009

Как вы сказали, вам нужно реализовать неуниверсальный IComparable. Вы можете использовать класс Comparer , если хотите реализовать этот интерфейс в общем виде:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...