C# List 根据对象属性去重的四种方法对比



  • private void TestDistinct()
    {
       Task.Run(() =>
       {
           //生成测试数据
           DateTime dt = DateTime.Now;
           Random rnd = new Random();
           List<MyData> list = new List<MyData>();
           int total = 1000000;
           for (int i = 0; i < total; i++)
           {
               MyData info = new MyData();
               info.id = rnd.Next(1, total * 10).ToString();
               info.name = rnd.Next(1, total * 10).ToString();
               list.Add(info);
           }
           double d = DateTime.Now.Subtract(dt).TotalMilliseconds;
    
           //方法一
           DateTime dt1 = DateTime.Now;
           Dictionary<string, MyData> result1 = new Dictionary<string, MyData>();
           foreach (MyData item in list)
           {
               MyData temp;
               if (!result1.TryGetValue(item.name, out temp))
               {
                   result1.Add(item.name, item);
               }
           }
           List<MyData> r1 = result1.Values.ToList();
           double d1 = DateTime.Now.Subtract(dt1).TotalMilliseconds;
    
           //方法二
           DateTime dt2 = DateTime.Now;
           List<MyData> result2 = list.ToLookup(item => item.name).ToDictionary(item => item.Key, item => item.First()).Values.ToList();
           double d2 = DateTime.Now.Subtract(dt2).TotalMilliseconds;
    
           //方法三
           DateTime dt3 = DateTime.Now;
           List<MyData> result3 = list.Distinct(new MyCompare()).ToList();
           double d3 = DateTime.Now.Subtract(dt3).TotalMilliseconds;
    
           //方法四
           DateTime dt4 = DateTime.Now;
           List<MyData> result4 = list.GroupBy(item => item.name).Select(item => item.First()).ToList();
           double d4 = DateTime.Now.Subtract(dt4).TotalMilliseconds;
    
           this.BeginInvoke(new Action(() =>
           {
               textBox1.Text = "";
               textBox1.Text += "生成 " + list.Count.ToString("# ####") + " 条测试数据耗时:" + d + "毫秒\r\n\r\n";
               textBox1.Text += "使用方法一去重耗时:" + d1 + "毫秒\r\n\r\n";
               textBox1.Text += "使用ToLookup和ToDictionary去重耗时:" + d2 + "毫秒\r\n\r\n";
               textBox1.Text += "使用Distinct去重耗时:" + d3 + "毫秒\r\n\r\n";
               textBox1.Text += "使用GroupBy和Select去重耗时:" + d4 + "毫秒\r\n\r\n";
               textBox1.Text += "去重后数量:" + r1.Count + "," + result2.Count + "," + result3.Count + "," + result4.Count + "" + "\r\n\r\n";
           }));
       });
    }
    
    public class MyData
    {
       public string id { get; set; }
       public string name { get; set; }
    }
    
    public class MyCompare : IEqualityComparer<MyData>
    {
       public bool Equals(MyData x, MyData y)
       {
           return x.name == y.name;
       }
    
       public int GetHashCode(MyData obj)
       {
           return obj.name.GetHashCode();
       }
    }
    

    测试结果:

    原文:https://www.cnblogs.com/s0611163/archive/2019/08/23/11399898.html

    来自:https://www.cnblogs.com/z-hj/p/11724960.html


Log in to reply
 

最新帖子

推荐阅读