📅  最后修改于: 2023-12-03 14:59:40.382000             🧑  作者: Mango
这篇文章将会介绍如何基于属性重复来移除C# List中的项。
当我们需要从C# List中移除重复项时,通常会使用Distinct方法,但在某些情况下,我们需要基于对象的某个属性来移除重复项。比如,有一个Person类,每个人有一个唯一的身份证号码,我们想要根据身份证号码来移除List中的重复项。
我们可以实现自己的IEqualityComparer来告诉List.Remove如何比较两个对象是否相等。以下是一个例子:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public string IdCardNum { get; set; }
}
public class PersonIdCardNumComparer : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
if (x == null || y == null) return false;
return x.IdCardNum == y.IdCardNum;
}
public int GetHashCode(Person obj)
{
return obj.IdCardNum.GetHashCode();
}
}
上面的代码中,我们创建了一个Person类和一个IEqualityComparer
然后,我们可以将IEqualityComparer
List<Person> persons = new List<Person>
{
new Person { Id = 1, Name = "Tom", IdCardNum = "123456" },
new Person { Id = 2, Name = "Jerry", IdCardNum = "234567" },
new Person { Id = 3, Name = "Bob", IdCardNum = "123456" }
};
var comparer = new PersonIdCardNumComparer();
persons = persons.GroupBy(p => p, comparer).Select(g => g.First()).ToList();
我们也可以使用LINQ的Distinct方法和Lambda表达式来基于属性去重,以下是一个例子:
List<Person> persons = new List<Person>
{
new Person { Id = 1, Name = "Tom", IdCardNum = "123456" },
new Person { Id = 2, Name = "Jerry", IdCardNum = "234567" },
new Person { Id = 3, Name = "Bob", IdCardNum = "123456" }
};
persons = persons.GroupBy(p => p.IdCardNum).Select(g => g.First()).ToList();
在上面的代码中,我们同样是根据IdCardNum属性去重,但是使用了LINQ的GroupBy方法和Select方法来实现,原理与上面的方法类似。注意,这里的List.GroupBy方法需要传入一个Lambda表达式,表示按照哪个属性进行分组。
本文介绍了两种移除C# List中重复项的方法,分别是自己编写IEqualityComparer和使用LINQ的Distinct方法和Lambda表达式。根据不同的场景和需求,选择适合的方法即可。