我有要检查的情况
1)如果任何道具(EmployeeObject),从empDb
出现在empXml
,返回true
。其他返回false
public class EmployeeObject
{
public Int32 Id { get; set; }
public string Title { get; set; }
public string Desc { get; set; }
.....
}
IList<EmployeeObject> empDb = PopulateFromDb(); //calling ado.net
IList<EmployeeObject> empXml = PopulateFromXml(); //deserializing xml
因此,让我弄清楚这一点,我试图确定listempXml
是否为list的子集empDb
?
到目前为止尝试过;但是即使我已经检查了两个列表中的数据,它也会返回false,并且应该返回true,除非我在表达式中做错了什么。
//at least one MATCH
empDb.Any(a => empXml.Contains(a));
或者
//at least one EXACT match
empDb.Any(x => empXml.Contains(y => x.Equals(y)));
如果你没有Equals
和GetHashCode
中实现EmployeeObject
类,那么员工将参照进行比较。而且您在这里肯定会有不同的实例,因为当您从数据库中读取数据时会创建第一个列表,而在反序列化xml时会创建第二个列表。因此,即使在所有字段中具有相同值的员工也将被认为是不同的。
如果您只想按员工ID检查匹配项,则可以将序列投影到ID,然后使用“相交”检查是否存在匹配项
// at least one employee with equal Id
empDb.Select(e => e.Id).Intersect(empXml.Select(e => e.Id)).Any()
如果要按员工的字段值而不是参考值来比较员工,则有几种选择。如果您不能或不想更改EmployeeObject类的实现并覆盖其Equals和GetHashCode方法,则可以为员工创建自定义比较器:
public class EmployeeComparer : IEqualityComparer<EmployeeObject>
{
public bool Equals(EmployeeObject x, EmployeeObject y)
{
return x.Id == y.Id
&& x.Title == y.Title
&& x.Desc == y.Desc;
}
public int GetHashCode(EmployeeObject obj)
{
int code = 19;
code = code * 23 + obj.Id.GetHashCode();
code = code * 23 + obj.Title.GetHashCode();
code = code * 23 + obj.Desc.GetHashCode();
return code;
}
}
然后,您可以使用此比较器:
empDb.Intersect(empXml, new EmployeeComparer()).Any()
或者,您可以将员工投影到匿名对象(具有Equals和GetHashCode的默认实现):
empDb.Select(e => new { e.Id, e.Title, e.Desc })
.Intersect(empXml.Select(e => new { e.Id, e.Title, e.Desc })).Any()
或覆盖以下方法:
public class EmployeeObject
{
public Int32 Id { get; set; }
public string Title { get; set; }
public string Desc { get; set; }
public override int GetHashCode()
{
int code = 19;
code = code * 23 + Id.GetHashCode();
code = code * 23 + Title.GetHashCode();
code = code * 23 + Desc.GetHashCode();
return code;
}
public override bool Equals(object obj)
{
EmployeeObject other = obj as EmployeeObject;
if (other == null)
return false;
if (ReferenceEquals(this, other))
return true;
return Id == other.Id &&
Title == other.Title && Desc == other.Desc;
}
}
并且您的代码将起作用。或者您可以使用相交:
empDb.Intersect(empXml).Any()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句