C# 忽略其中一个字段的列表中的不同项目数

C# 忽略其中一个字段的列表中的不同项目数,c#,list,C#,List,现在让我们有两个Person对象: 无名氏 无聊的街5号 1. 及 无名氏 无聊的街5号 2. 这两个条目在人物列表中对我来说并不明显。 我想在忽略ID字段的情况下获取ListOfPeople中不同条目的数量。如果我只执行Distinct,它会将这两个对象视为同一对象,因为ID不相同。创建一个IEqualityComparer实现,定义您希望如何比较值。然后您可以使用 public class Person { public string Name { get; set; } = str

现在让我们有两个Person对象:

无名氏 无聊的街5号 1. 及

无名氏 无聊的街5号 2. 这两个条目在人物列表中对我来说并不明显。 我想在忽略ID字段的情况下获取ListOfPeople中不同条目的数量。如果我只执行Distinct,它会将这两个对象视为同一对象,因为ID不相同。

创建一个IEqualityComparer实现,定义您希望如何比较值。然后您可以使用

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>();
您的相等比较器如下所示:

var distinctByNameAndAddress = people.Distinct(comparer).ToList();
请注意,目前,您没有覆盖Equals/GetHashCode或实现IEquatable,因此即使两个具有相同属性的对象也会被视为不同的对象。

创建一个IEqualityComparer实现,该实现定义了要如何比较值。然后您可以使用

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>();
您的相等比较器如下所示:

var distinctByNameAndAddress = people.Distinct(comparer).ToList();

请注意,目前,您没有覆盖Equals/GetHashCode或实现IEquatable,因此即使两个具有相同属性的对象也会被视为不同的对象。

您必须构造一个没有ID的新类型,并在该类型上执行distinct,或者忽略该属性并丢失其中一个对象,即ID=1的对象将获胜。你想要哪一个?@LasseV.Karlsen,因为我只想要所说的不同对象的数量,而不是实际对象的数量,我认为哪一个对象获胜是不相关的。你要么构造一个没有ID的新类型,并在该类型上进行不同,要么忽略该属性并失去其中一个对象,即ID=1的对象获胜。你想要哪一个?@LasseV.Karlsen因为我只想要所说的不同对象的数量,而不是实际对象的数量,我想哪一个赢了是不相关的。我不知道我可以创建自己的比较器以及如何创建比较器,非常好用,谢谢。看起来不同对象不检查值的空值,根据。我不知道我可以创建自己的比较器以及如何创建它,非常好地工作,谢谢。根据。