C#中List对象去重的三种方法

在开发中当后端接受到JSON对象数组时,当转成List<T>时后会有重复的情况,如何高效快捷的去除重复呢,这篇文章我们介绍三种去除数组对象里的重复方法。.

1、循环去除重复

    使用循环去除重复,需要新实例化一个List<T>,再循环判断数组对象里是否有这个对象,如果有没有重复添加到这个集合对象,否则不添加。代码如下:

  //在对象添加数据,下面案例都用这个集合  public static List<Customer> GetCustomer()  {      List<Customer> list = new List<Customer>();      list.Add(new Customer { id = 1, name = "刘德华", age = 56, email = "ldh@net.cn" });      list.Add(new Customer { id = 2, name = "张学友", age = 52, email = "zxy@net.cn" });      list.Add(new Customer { id = 3, name = "黎明", age = 58, email = "lm@net.cn" });      list.Add(new Customer { id = 4, name = "郭富城", age = 60, email = "gfc@net.cn" });      list.Add(new Customer { id = 4, name = "古天乐", age = 55, email = "gtl@net.cn" });      list.Add(new Customer { id = 3, name = "黎明", age = 58, email = "lm@net.cn" });      return list;  } static void Main(string[] args) {     var rel = new List<Customer>();//新new一个对象,     foreach (var item in GetCustomer())     {   //判断是否存在,不存在添加         if (rel.Where(w => w.id == item.id & w.name == item.name && w.age == item.age && w.email == item.email).Count() == 0)             rel.Add(item);//不存在新增     }     foreach (var item in rel)     {Console.WriteLine(item.name);}     Console.WriteLine("======================");  } //客户对象,下面案例不再列出public class Customer{        public int id { get; set; }        public string name { get; set; }        public string email { get; set; }        public int age { get; set; }  }

2、使用Linq中GroupBy去重

linq是个好东西,对于对象的操作很方便,GroupBy类似数据库中的group by。这个例子就不需要循环了,直接一句代码解决,简便多了。代码如下:

 static void Main(string[] args) {        //一句代码解决。        var rel= GetCustomer().GroupBy(g=>new { g.id, g.name,g.age,g.email });        foreach (var item in rel)        {            Console.WriteLine(item.Key.name);        }        Console.WriteLine("======================");  }

3、使用Linq中Distinct去重

Distinct跟数据库中的Distinct还是有一定的区别,对于对象集合去除重复需要自定义客户对象的Comparer方法。代码如下:

 static void Main(string[] args) {   //Distinct方法   var rel = GetCustomer().Distinct(new CustomerComparer());   foreach (var item in rel)   {       Console.WriteLine(item.name);   }   Console.WriteLine("======================");}//需要继承IEqualityComparer,先判断第一个字段,如果有重复再做对比。 public class CustomerComparer : IEqualityComparer<Customer>        {            public bool Equals(Customer x, Customer y)            {                if (x == null)                    return y == null;                return x.id == y.id && x.name == y.name && x.age == y.age&&x.email==y.email;            }            public int GetHashCode(Customer obj)            {                if (obj == null)                    return 0;                return obj.id.GetHashCode();            }}

 结语

    这三种去重复的方法,笔者比较喜欢使用第二种,第二种代码量少,容易理解。你喜欢哪种去重复的方法呢?欢迎留言。面试时面试官也会考到这种基础问题,如果你能答出这三种方法就很不错了。 希望本文对大家学习和工作有一定参考价值,同时欢迎大家留言讨论,谢谢大家的支持。