代码之家  ›  专栏  ›  技术社区  ›  mko

如何比较同一复杂类型的两个列表?[复制品]

  •  0
  • mko  · 技术社区  · 7 年前

    这个问题已经有了答案:

    我有两个同一复杂类型的列表,即类。

    var list1 = new List<Info>();
    list1.Add(new Info(){ A = 100, B = 100 });
    list1.Add(new Info(){ A = 200, B = 200 });
    
    var list2 = new List<Info>();
    list2.Add(new Info(){ A = 20, B = 20 });
    list2.Add(new Info(){ A = 200, B = 200 });
    
    public class Info
    {
            public int A {get;set;}
            public int B {get;set; }
    }
    

    当我这样做的时候

    list1.Except(list2);
    

    我得到了一个不正确的结果。显然,结果显示了列表1的所有项。

    { A = 100, B = 100 }
    { A = 200, B = 200 }
    

    当我对相同的操作使用匿名类时,得到了正确的结果

    list1.Select(a=> new { A = a.A, B = a.B}).Except(list2.Select(b=> new {A = b.A, B = b.B})).ToList();
    

    我做错什么了?

    这不是重复的问题,因为“原始”问题在未回答和含糊不清的解释。此外,这个问题还引入了比较匿名对象的可能性。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Ousmane D.    7 年前

    你没有凌驾于 Equals / GetHashCode 在你 Info 所以没有办法 Except 确定两个给定值之间的相等性 信息 物体。

    这在你使用的时候有效 Anonymous types :

    因为 等于 方法 匿名类型的方法是 定义为 等于 方法 方法 性质, 只有在以下情况下,相同匿名类型的两个实例才相等 它们的所有性质都相等 .