如何在C#中比较两个对象列表?

时间:2015-04-07 19:33:30

标签: linq list

假设我有一个对象列表:

public class MyObject
{
    public int ID {get;set;}
    public string Name {get;set;}
    public DateTime StartDate {get;set;}
}

现在数据:

{0, "my", DateTime.Now}
{0, "List", DateTime.Now}
{0, "Data", DateTime.Now}

现在说我从XML或Excel文档中删除了这些数据,我希望与数据库中的内容进行比较并忽略已存在的数据。我正在使用Entity Framework来处理这个问题。

 public IEnumerable<MyObject> GetBy()
{
    return _context.MyObjects.OrderBy(x => x.Name);
}

我知道您是否希望从列表中获取与您使用的不同的数据:

var myNewStuff = myStuff.Except(myDataBaseStuff);

但是没有任何ID属性匹配,因此不起作用

如何根据Name和StartDate值比较两个列表?

1 个答案:

答案 0 :(得分:4)

您需要实现自己的IEqualityComparer并使用获取它的Except重载。使用Resharper,我生成了这个:

public sealed class NameStartDateEqualityComparer : IEqualityComparer<MyObject>
{
    public bool Equals(MyObject x, MyObject y)
    {
        if (ReferenceEquals(x, y)) return true;
        if (ReferenceEquals(x, null)) return false;
        if (ReferenceEquals(y, null)) return false;
        if (x.GetType() != y.GetType()) return false;
        return string.Equals(x.Name, y.Name) && x.StartDate.Equals(y.StartDate);
    }

    public int GetHashCode(MyObject obj)
    {
        unchecked
        {
            return ((obj.Name != null ? obj.Name.GetHashCode() : 0)*397) ^ obj.StartDate.GetHashCode();
        }
    }
}

请注意,比较器仅检查NameStartDate属性。您当然可以根据自己的喜好更改比较器,例如在比较它们之前截断StartDate的毫秒数。然后使用它:

var myNewStuff = myStuff.Except(myDataBaseStuff, new NameStartDateEqualityComparer());