之前比较两个序列时,用到了匿名对象, 工作正常。
前一段时间做了一次重构,把这个匿名对象写成了类,结果。。。当然是没想到翻了船.
public class Tmp
{
public int Tag { get; set; }
}
/// <summary>
///
/// </summary>
[TestMethod]
public void CompareTest()
{
var a = new
{
Tag = 1
}.MakeEnumerable();
var b = new
{
Tag = 1
}.MakeEnumerable();
var c = a.Except(b);
Assert.AreEqual(c.Count(), 0);
Assert.AreEqual(a.First(), b.First());
var aa = new Tmp()
{
Tag = 1
}.MakeEnumerable();
var bb = new Tmp()
{
Tag = 1
}.MakeEnumerable();
var cc = aa.Except(bb);
Assert.AreEqual(cc.Count(), 0, "傻吊了吧!!!");
}
QQ图片20201118181640.png
这是因为: 两个匿名对象只要各个属性的值都都相等,就认为是相同的. 但是两个类实例, 它们是不同的对象...
如果程序集中的两个或多个匿名对象初始值指定了属性序列,这些属性采用相同顺序且具有相同的名称和类型,则编译器将对象视为相同类型的实例。 它们共享同一编译器生成的类型信息。
...
由于匿名类型上的 Equals 和 GetHashCode 方法是根据方法属性的Equals
和GetHashCode
定义的,因此仅当同一匿名类型的两个实例的所有属性都相等时,这两个实例才相等。
要判断两个类实例是否相等, 要么转成匿名象, 要么使用 IEqualityCompare<T>
, (参考地址)
网友评论