如何获得两个列表的差异<>对象?

时间:2014-05-28 14:54:55

标签: c# list visual-studio-2008

我生成一个名为Exceptions的对象列表:

public class Exceptions
{
    public bool deleted { get; set; }
    public DateTime OriginalDate { get; set; }
    public DateTime StartUtc { get; set; }
    public DateTime EndUtc { get; set; }
    public Int32 NumParticipants { get; set; }
    public String Subject { get; set; }
    public String Location { get; set; }
}

列表A有2个对象,列表B有3个对象

我期待一个新的列表,它显示了两个对象之间的区别

我尝试使用以下功能:

var ListC = ListA.Except(ListB).ToList();

我在ListC中得到两个看起来与ListA完全相同的对象。但我希望列表B中缺少对象。

我做错了什么?

4 个答案:

答案 0 :(得分:0)

Expect使用默认的相等比较器来比较您的对象,通过 reference 比较它们。您需要实现自定义相等比较器并将该比较器与Except方法一起使用。

如果您不知道如何为您的类型实施IEqualityComparer<T>,则可以在MSDN上找到示例。

答案 1 :(得分:0)

你需要这样做:

var ListC = ListA.Except(ListB).Union(ListB.Except(ListA))

答案 2 :(得分:0)

我建议您覆盖Equals()GetHashCode(),以便比较符合您的期望。

public class Exceptions
{
   public override bool Equals(object o)
   {
      return this.Equals(o as Exceptions);
   }

   public bool Equals(Exceptions ex)
   {
       if(ex == null)
          return false;
       else
       {
           // Do comparison here
       }
   }
}

答案 3 :(得分:0)

Linq替代,可能会有更快的方法: HashSet.SymmetricExceptWith():

var exceptions = new HashSet(listA);

exceptions.SymmetricExceptWith(listB);