Если вы не имеете Equals
и GetHashCode
реализованы в EmployeeObject
классе, то сотрудники будут сравниваться по ссылке. И у вас обязательно будут разные экземпляры здесь, потому что первый список создается при чтении данных из базы данных, а второй список создается при десериализации xml. Таким образом, даже сотрудники с одинаковыми значениями всех полей будут считаться разными.
Если вы хотите проверить матчи только идентификатор сотрудника, то вы можете проецировать последовательности идентификаторов, а затем использовать Intersect, чтобы проверить соответствие существует
// 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;
}
}
И ваш код будет работать. Или вы можете использовать Intersect:
empDb.Intersect(empXml).Any()
ли вы '' Equals' и GetHashCode' реализованного в классе 'EmployeeObject'? Если нет, то что, если у вас будет два объекта с одинаковым идентификатором, но с другим заголовком? –