【发布时间】: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 与上述工作示例中的唯一区别在于它们的填充方式。有人知道为什么会这样吗?
【问题讨论】:
-
如果你不介意的话,我把代码压缩了一点,这样我们就不需要滚动阅读它了。
-
能否提供
oldContatinerClass和newContatinerCalss的代码? -
你能制作一个简短但完整的程序来演示这个问题吗?我无法从您显示的代码中看出为什么会发生这种情况。 (您不需要 == 和 != 运算符来演示它。)
标签: c# linq iequatable