美文网首页
IEqualityComparer

IEqualityComparer

作者: gruan | 来源:发表于2020-11-18 18:26 被阅读0次

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

    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>, (参考地址)

    相关文章

      网友评论

          本文标题:IEqualityComparer

          本文链接:https://www.haomeiwen.com/subject/iaociktx.html