У меня есть два списка сотрудников, из которых я хочу получить только уникальные записи, но у этого есть поворот. Каждый список имеет класс Employee в нем:Сравнение двух списков и игнорирование определенного свойства
public class Employee
{
// I want to completely ignore ID in the comparison
public int ID{ get; set; }
// I want to use FirstName and LastName in comparison
public string FirstName{ get; set; }
public string LastName{ get; set; }
}
Единственные свойства, которые я хочу, чтобы сравнить в течение матча являются FirstName и LastName. Я хочу полностью игнорировать ID в сравнении. В списке allFulltimeEmployees есть 3 сотрудника, а в списке allParttimeEmployees есть 3 сотрудника. Первое имя и фамилия совпадают по двум пунктам в списках - Салли Джонс и Фред Джексон. Существует один элемент в списке, который не соответствует, потому что FirstName это то же самое, но LastName отличается:
emp.id = null; // not populated or used in comparison
emp.FirstName = "Joe"; // same
emp.LastName = "Smith"; // different
allFulltimeEmployees.Add(emp);
emp.id = 3; // not used in comparison
emp.FirstName = "Joe"; // a match
emp.LastName = "Williams"; // not a match - different last name
allParttimeEmployees.Add(emp);
Так что я хочу, чтобы игнорировать свойство ID в классе во время сравнения двух списков. Я хочу отметить Джо Уильямса как несоответствие, так как последние имена Смита и Уильямса в двух списках не совпадают.
// finalResult should only have Joe Williams in it
var finalResult = allFulltimeEmployees.Except(allParttimeEmployees);
Я попытался с помощью IEqualityComparer, но он не работает, так как он использует один класс Employee в параметрах, а не IEnumerable списка:
public class EmployeeEqualityComparer : IEqualityComparer<Employee>
{
public bool Equals(Employee x, Employee y)
{
if (x.FirstName == y.FirstName && x.LastName == y.LastName)
{
return true;
}
else
{
return false;
}
}
public int GetHashCode(Employee obj)
{
return obj.GetHashCode();
}
}
Как я могу успешно делать то, что Я хочу и выполнить эту операцию? Спасибо за любую помощь!
Спасибо Anthony - это была именно проблема. Как только я исправил свой метод GetHashCode, он работал нормально. В чем смысл «117»? Просто добавить дополнительную уникальность в расчетное значение? Кроме того, как я могу обращаться с нулями в методе GetHashCode? Еще раз спасибо за ответ! – Frekster
Математика является кивком для реализаций, таких как [рекомендуемые здесь] (http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode) , Подробнее о правилах и рекомендациях для GetHashCode, [это отличное чтение] (http://blogs.msdn.com/b/ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx). –
Что касается нулей, вы просто не хотите получать доступ к свойствам объектов null Employee и не хотите вызывать методы для свойств null. Поэтому вы хотите иметь соответствующие нулевые проверки, если у вас есть какая-либо озабоченность по поводу наличия нулей. –