列表中忽略其中一个字段

时间:2017-09-13 07:38:26

标签: c# list

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个对象:

  • John Doe
  • Boring St. 5
  • 1

  • John Doe
  • Boring St. 5
  • 2

ListOfPeople中的这2个条目对我来说并不明显。 我想在ListOfPeople中获取多个不同的条目,同时忽略ID字段。如果我只做Distinct(),它会将这两个对象视为那个(因为ID不一样)。

1 个答案:

答案 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>,因此即使是两个所有属性的对象,同样会被视为截然不同。