• 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 + "毫秒
    
    ";
                textBox1.Text += "使用方法一去重耗时:" + d1 + "毫秒
    
    ";
                textBox1.Text += "使用ToLookup和ToDictionary去重耗时:" + d2 + "毫秒
    
    ";
                textBox1.Text += "使用Distinct去重耗时:" + d3 + "毫秒
    
    ";
                textBox1.Text += "使用GroupBy和Select去重耗时:" + d4 + "毫秒
    
    ";
                textBox1.Text += "去重后数量:" + r1.Count + "" + result2.Count + "" + result3.Count + "" + result4.Count + "" + "
    
    ";
            }));
        });
    }
    View Code

    数据类:

    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();
        }
    }
    View Code

    测试结果:

    结论:

    方法一和方法三去重速度差不多,在一个数量级

    方法二和方法四去重速度差不多,在一个数量级

    方法二和方法四比方法一和方法三大约慢4、5倍左右

    方法二和方法四比较方便,一行代码搞定,方法一和方法三代码行数相对较多,方法三要写个MyCompare

  • 相关阅读:
    bzoj1589[Usaco2008 Dec]Trick or Treat on the Farm 采集糖果*
    bzoj1672[Usaco2005 Dec]Cleaning Shifts 清理牛棚*
    bzoj1691[Usaco2007 Dec]挑剔的美食家*
    bzoj1637[Usaco2007 Mar]Balanced Lineup*
    LinkedList源码
    链表
    反向打印链表
    空格替换
    二维数组查找
    待编辑
  • 原文地址:https://www.cnblogs.com/s0611163/p/11399898.html
Copyright © 2020-2023  润新知