【问题标题】:Failed to compare two elements in the array无法比较数组中的两个元素
【发布时间】:2009-11-01 22:45:07
【问题描述】:

我有一个List<T>,其中T 是一个公开“用户名”属性的类。用户名是封装字符串的自定义类型。我在这个简单返回的自定义类型上实现了IComparable<T> 接口

this.encapsulatedString.CompareTo(other.encapsulatedString)

我因此定义了列表的ICollectionView

AllUsers=CollectionViewSource.GetDefaultView(myList);

我添加了一个排序描述:

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

在这一行代码抛出了标题中所述的异常。我可以毫无问题地通过其他方式对列表进行排序。异常来自哪里?

【问题讨论】:

  • 遗憾的是,Microsoft 无法抛出智能且易于理解的错误消息。例如“无法比较数组中的两个元素,因为未实现接口 IComparable。”

标签: .net exception sorting


【解决方案1】:

自定义类型必须实现IComparableIComparable<T>SortDescription 似乎使用了老式的非泛型版本的 CompareTo

【讨论】:

    【解决方案2】:

    在我的例子中,我在 Compare 函数中添加了一个 try/catch 块,并将异常消息显示到控制台。如果您的比较函数中存在错误,您将收到此次要异常(“无法比较两个元素...”)。

    我的问题特别是由于另一个错误,索引到字符串的位置 3 是 ""。

    【讨论】:

    • 对我来说,这也是由比较函数内部的异常引起的。
    【解决方案3】:

    据我所知,您的回答并不完全正确。我的对象根本没有实现 IComarable 或 IComparable,它们仍然可以正常工作。我正在创建一个 CollectionViewSource 并像您一样添加排序描述,但没有收到此错误。我收到错误是因为排序描述中的属性是空白的。一旦我解决了这个问题,没有界面就一切正常。我怀疑您的属性可能不正确,如果它无法访问该属性,它会退回到使用 IComparable。

    【讨论】:

      【解决方案4】:

      正如你所说,你需要实现非泛型IComparable。如果你想以一种很好的通用方式实现这个接口,你可以使用 Comparer 类:)

      【讨论】:

        【解决方案5】:

        在我的例子中,被排序的属性是object,当一些对象是ints 而其他对象是strings 时发生错误。

        我本可以实现IComparable,但该类的使用确实更适合字符串 - 我能够将object更改为string,并确保所有设置器都使用称为.ToString()的数字,一切都是从那里开始的。

        【讨论】:

          猜你喜欢
          • 2016-07-30
          • 1970-01-01
          • 1970-01-01
          • 2016-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-06
          • 2017-08-29
          相关资源
          最近更新 更多