无法比较数组中的两个元素

时间:2009-11-01 22:45:08

标签: .net exception sorting

我有一个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 个答案:

答案 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(),而且都是从那里开始的。