【问题标题】:Linq .Except function "At least one object must implement IComparable."Linq .Except 函数“至少一个对象必须实现 IComparable。”
【发布时间】:2011-01-14 19:44:58
【问题描述】:

基本上我有一个实现 IEquatable 的容器(示例如下所示)

public class ContainerClass  : IEquatable<ContainerClass>
{
        public IEnumerable<CustomClass> CustomClass { get; set; }

        public override bool Equals(object obj) { ... }
        public bool Equals(ContainerClass other) { ... }
        public static bool operator ==(ContainerClass cc1, ContainerClass cc2) { ... }
        public static bool operator !=(ContainerClass cc1, ContainerClass cc2) { ... }
        public override int GetHashCode() { ... }
}

还有一个同样实现 IEquatable 的 CustomClass

public class CustomClass : IEquatable<CustomClass>
{
        public string stringone { get; set; }
        public string stringtwo { get; set; }

        public override bool Equals(object obj) { ... }
        public bool Equals(CustomClass other) { ... }
        public static bool operator ==(CustomClass cc1, CustomClass cc2) { ... }
        public static bool operator !=(CustomClass cc1, CustomClass cc2) { ... }
        public override int GetHashCode() { ... }
}

这一切都很好,例如,下面的作品

IEnumerable<CustomClass> customclassone = new List<CustomClass>
    {
        new CustomClass { stringone = "hi" },
        new CustomClass { stringone = "lo" }
    };
IEnumerable<CustomClass> customclasstwo = new List<CustomClass>
    {
        new CustomClass { stringone = "hi" }
    };

var diff = customclassone.Except(customclasstwo);

ContainerClass containerclassone = new ContainerClass 
{
    CustomClass = customclassone.AsEnumerable()
};
ContainerClass containerclasstwo = new ContainerClass 
{
    CustomClass = customclasstwo.AsEnumerable()
};

var diff2 = containerclassone.CustomClass.Except(customclasstwo.CustomClass);

在此代码之后,枚举时的 diff 和 diff2 都包含预期的结果。但是,如果我再尝试

IEnumerable<CustomClass> oldCustom = oldContainerClass.CustomClass;
IEnumerable<CustomClass> newcustom = newContainerClass.CustomClass;
var exceptlist = oldCustom.Except(newcustom);

当我尝试枚举异常列表时,我得到“至少一个对象必须实现 IComparable。”。 oldCustom 和 newCustom 与上述工作示例中的唯一区别在于它们的填充方式。有人知道为什么会这样吗?

【问题讨论】:

  • 如果你不介意的话,我把代码压缩了一点,这样我们就不需要滚动阅读它了。
  • 能否提供oldContatinerClassnewContatinerCalss 的代码?
  • 你能制作一个简短但完整的程序来演示这个问题吗?我无法从您显示的代码中看出为什么会发生这种情况。 (您不需要 == 和 != 运算符来演示它。)

标签: c# linq iequatable


【解决方案1】:

我怀疑您试图对ContainerClass.CustomClass 的这些内容进行排序。由于延迟执行,直到您遍历它并且Except() 只是一个红鲱鱼,您才知道有问题。 CustomClass 没有实现 IComparable 接口,因此排序失败并出现该错误。您的CustomClass 应该实现IComparable&lt;T&gt; 接口,或者您应该在OrderBy() 上传递IComparer

例如,

oldContainerClass.CustomClass = someListOfSomeType.OrderBy(x => x.CustomClasss, myComparer)
                                                  .Select(x => x.CustomClass);

虽然这有助于了解您为这些属性分配的具体内容,以便我们为您提供更准确的原因。

【讨论】:

  • 你可能是对的......除了不需要 IComparable 反正
  • 伙计,我很笨,我在 CustomClass 中获取变量的哈希码之一是尝试排序但没有比较器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 2019-11-01
相关资源
最近更新 更多