Подтвердить что ты не робот

Не удалось сравнить два элемента в массиве

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

this.encapsulatedString.CompareTo(other.encapsulatedString)

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

AllUsers=CollectionViewSource.GetDefaultView(myList);

Я добавил Sortdescription:

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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