C#_使用 linq 删除 List 列表中重复项的三种方法

  1. 如果是list中存储的是string,int等基本数据类型,直接使用Distinct方法
List<string> lst = new List<string>() {"A","B","C","A" }; 
var result = lst.Distinct().ToList();

         2.如果存储的是类,你需要设定两个类之间重复的标准。

  • 实现 IEquatable<T> 接口。
    class Program
    {
        static void Main(string[] args)
        {
            List<Student> stuLst = new List<Student>() { 
                new Student(){ Id =1,Name = "A",Age = 10},
               new Student(){ Id =2,Name = "B",Age = 12},
                new Student(){ Id =3,Name = "C",Age = 13},
                new Student(){ Id =1,Name = "A",Age = 11}
            };
            var results = stuLst.Distinct().ToList();
            foreach (var result in results)
                Console.WriteLine(result.Id + " " + result.Name + " " + result.Age);
            Console.ReadLine();
        }
    }
class Student : IEquatable<Student>
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }

    /// <summary>
    /// Standard: If one class‘s Id and Name is the same as antoher class, then they are duplicate.
    /// </summary>
    public bool Equals(Student other)
    {
        if (Object.ReferenceEquals(other, null)) return false;

        if (Object.ReferenceEquals(this, other)) return true;

        return Id.Equals(other.Id) && Name.Equals(other.Name);
    }
    // If Equals() returns true for a pair of objects  
    // then GetHashCode() must return the same value for these objects. 
    public override int GetHashCode()
    {
        return Id.GetHashCode() ^ Name.GetHashCode();
   }
}
  • 实现 IEqualityComparer<T> 接口
    class Program
    {
        static void Main(string[] args)
        {
            List<Student> stuLst = new List<Student>() {
                new Student(){ Id =1,Name = "A",Age = 10},
                new Student(){ Id =2,Name = "B",Age = 12},
                new Student(){ Id =3,Name = "C",Age = 13},
                new Student(){ Id =1,Name = "A",Age = 11}
            };

            var results = stuLst.Distinct(new StudentComparer()).ToList();

            foreach (var result in results)
                Console.WriteLine(result.Id + " " + result.Name + " " + result.Age);
            Console.ReadLine();
        }
    }
class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}
class StudentComparer : IEqualityComparer<Student>
{
    /// <summary>
    /// Standard: If one class‘s Id and Name is the same as antoher class, then they are duplicate.
    /// </summary>
    public bool Equals(Student x, Student y)
    {
        if (Object.ReferenceEquals(x, y)) return true;
        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;
        return x.Id == y.Id && x.Name == y.Name;
    }
    public int GetHashCode(Student student)
    {
        if (Object.ReferenceEquals(student, null)) return 0;
        return student.Id.GetHashCode() ^ student.Name.GetHashCode();
    }
}

 

C#_使用 linq 删除 List 列表中重复项的三种方法

上一篇:C# DataTable转Json


下一篇:微软发布Windows Terminal Preview v0.10