假设我有一个对象列表:
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值比较两个列表?
答案 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();
}
}
}
请注意,比较器仅检查Name
和StartDate
属性。您当然可以根据自己的喜好更改比较器,例如在比较它们之前截断StartDate
的毫秒数。然后使用它:
var myNewStuff = myStuff.Except(myDataBaseStuff, new NameStartDateEqualityComparer());