4

基本上我有一个实现 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 与上述工作示例中的唯一区别在于它们的填充方式。有人知道为什么会这样吗?

4

1 回答 1

13

我怀疑您试图对ContainerClass.CustomClass. 由于延迟执行,您直到迭代它才知道存在问题,这Except()只是一个红鲱鱼。 CustomClass没有实现IComparable接口,因此排序失败并出现该错误。你CustomClass应该要么实现IComparable<T>接口,要么你应该IComparer在你的OrderBy().

例如,

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

尽管这将有助于查看您为这些属性分配的确切内容,以便我们可以为您提供更准确的原因。

于 2011-01-14T11:36:43.673 回答