Ответ 1
Stupidstupidstupid: пользовательский тип должен реализовывать IComparable
, а также IComparable<T>
Кажется, что SortDescription использует старую нестандартную версию CompareTo
Я собираюсь получить очень необходимый сон...
У меня есть 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));
В этой строке код генерирует исключение, указанное в заголовке. Я могу сортировать список другими способами без проблем. Откуда возникает исключение?
Stupidstupidstupid: пользовательский тип должен реализовывать IComparable
, а также IComparable<T>
Кажется, что SortDescription использует старую нестандартную версию CompareTo
Я собираюсь получить очень необходимый сон...
В моем случае я добавил блок try/catch внутри функции Compare и отобразил сообщение об исключении на консоль. Если в вашей функции сравнения есть ошибка, вы получите это вторичное исключение ( "Не удалось сравнить два элемента..." ).
Моя проблема была конкретно связана с индексированием позиции 3 строки, которая была "из-за другой ошибки".
ваш ответ не является строго правильным из того, что я могу сказать. Мои объекты не реализуют IComarable или IComparable вообще, и они все еще работают нормально. Я создаю CollectionViewSource и добавляю описания сортировки так же, как вы, и не получаю эту ошибку. Я получил ошибку, потому что свойство в описании сортировки было пустым. Как только я исправил это, все отлично работало без интерфейса. Я подозреваю, что у вас некорректная собственность, и она возвращается к использованию IComparable, если она не может получить доступ к свойству.
Как вы сказали, вам нужно реализовать не-общий IComparable
. Вы можете использовать Comparer <T> класс, если вы хотите реализовать этот интерфейс в общем виде:)
В моем случае свойство, которое сортируется, было object
, и ошибка возникала, когда некоторые из объектов были int
, а другие были string
s.
Я мог бы реализовать IComparable
, но использование этого класса было действительно более строковым. Я смог изменить object
на string
и убедиться, что все сеттеры, использующие числа, называемые .ToString()
, и все было настроено оттуда.