我有一个List<T>
,其中T
是一个公开“用户名”属性的类。用户名是封装字符串的自定义类型。我在这个自定义类型上实现了IComparable<T>
接口,只返回
this.encapsulatedString.CompareTo(other.encapsulatedString)
我定义了列表的ICollectionView
:
AllUsers=CollectionViewSource.GetDefaultView(myList);
我添加了Sortdescription:
AllUsers.SortDescriptions.Add(new SortDescription("Username",ListSortDirection.Ascending));
在这一行中,代码抛出标题中声明的异常。我可以通过其他方式排序列表没有问题。异常来自哪里?
答案 0 :(得分:50)
Stupidstupidstupid:自定义类型必须实现IComparable
以及IComparable<T>
似乎SortDescription使用了老式的非泛型版本的CompareTo
我会得到一些急需的睡眠......
答案 1 :(得分:5)
根据我的判断,你的答案并不完全正确。我的对象根本没有实现IComarable或IComparable,它们仍然可以正常工作。我正在创建一个CollectionViewSource并添加与您类似的排序描述,而不是出现此错误。我收到错误,因为排序说明中的属性为空。一旦我修复了这一切,一切正常,没有界面。我怀疑你可能有一个不正确的属性,如果它无法访问该属性,它将回退到使用IComparable。
答案 2 :(得分:5)
就我而言,我在Compare函数中添加了一个try / catch块,并向控制台显示了异常Message。如果比较函数中存在错误,您将获得此次要异常(“无法比较两个元素......”)。
我的问题特别是索引到由于另一个错误导致的字符串的位置3。
答案 3 :(得分:0)
正如您所说,您需要实现非通用IComparable
。您可以使用Comparer&lt; T&gt; class,如果你想以一种很好的通用方式实现这个接口:)
答案 4 :(得分:0)
就我而言,排序的属性为object
,当某些对象为int
且其他对象为string
时,错误发生。
我可以实现IComparable
,但是该类的使用实际上更符合字符串 - 我能够将object
更改为string
,并确保所有使用者都使用数字叫.ToString()
,而且都是从那里开始的。