public class Person
{
public string Name { get; set; } = string.Empty;
public string Address { get; set; } = string.Empty;
public int ID { get; set; } = 0;
}
public List<Person> ListOfPeople = new List<Person>();
现在让我们有2个Person
个对象:
和
ListOfPeople
中的这2个条目对我来说并不明显。
我想在ListOfPeople
中获取多个不同的条目,同时忽略ID
字段。如果我只做Distinct()
,它会将这两个对象视为那个(因为ID不一样)。
答案 0 :(得分:7)
创建一个IEqualityComparer<Person>
实现,定义您希望如何比较值。然后你可以使用
var distinctByNameAndAddress = people.Distinct(comparer).ToList();
你的平等比较器看起来像这样:
public sealed class NameAndAddressComparer : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
if (ReferenceEquals(x, y))
{
return true;
}
if (ReferenceEquals(x, null) || ReferenceEquals(y, null))
{
return false;
}
return x.Name == y.Name && x.Address == y.Address;
}
public int GetHashCode(Person person) =>
ReferenceEquals(person, null) ? 0
: 23 * person.Name.GetHashCode() + person.Address.GetHashCode();
}
请注意,目前,您不能覆盖Equals
/ GetHashCode
或实施IEquatable<Person>
,因此即使是两个所有属性的对象,同样会被视为截然不同。