IEqualityComparer

2020-11-18  本文已影响0人  gruan

之前比较两个序列时,用到了匿名对象, 工作正常。
前一段时间做了一次重构,把这个匿名对象写成了类,结果。。。当然是没想到翻了船.

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

这是因为: 两个匿名对象只要各个属性的值都都相等,就认为是相同的. 但是两个类实例, 它们是不同的对象...

如果程序集中的两个或多个匿名对象初始值指定了属性序列,这些属性采用相同顺序且具有相同的名称和类型,则编译器将对象视为相同类型的实例。 它们共享同一编译器生成的类型信息。
...
由于匿名类型上的 EqualsGetHashCode 方法是根据方法属性的 EqualsGetHashCode 定义的,因此仅当同一匿名类型的两个实例的所有属性都相等时,这两个实例才相等。

要判断两个类实例是否相等, 要么转成匿名象, 要么使用 IEqualityCompare<T>, (参考地址)

上一篇 下一篇

猜你喜欢

热点阅读