📜  c# list remove item based on property duplicate - C# (1)

📅  最后修改于: 2023-12-03 14:59:40.382000             🧑  作者: Mango

C# List Remove Item based on Property Duplicate

简介

这篇文章将会介绍如何基于属性重复来移除C# List中的项。

当我们需要从C# List中移除重复项时,通常会使用Distinct方法,但在某些情况下,我们需要基于对象的某个属性来移除重复项。比如,有一个Person类,每个人有一个唯一的身份证号码,我们想要根据身份证号码来移除List中的重复项。

实现方法
1. 自己编写IEqualityComparer

我们可以实现自己的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实现类,该类用于比较Person对象的IdCardNum属性是否相等。

然后,我们可以将IEqualityComparer实例传入List.Remove方法中,这样就可以根据IdCardNum属性来移除重复项了:

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();
2. 使用LINQ去重

我们也可以使用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表达式。根据不同的场景和需求,选择适合的方法即可。