测试代码:

  1. private void TestDistinct()
  2. {
  3. Task.Run(() =>
  4. {
  5. //生成测试数据
  6. DateTime dt = DateTime.Now;
  7. Random rnd = new Random();
  8. List<MyData> list = new List<MyData>();
  9. int total = ;
  10. for (int i = ; i < total; i++)
  11. {
  12. MyData info = new MyData();
  13. info.id = rnd.Next(, total * ).ToString();
  14. info.name = rnd.Next(, total * ).ToString();
  15. list.Add(info);
  16. }
  17. double d = DateTime.Now.Subtract(dt).TotalMilliseconds;
  18.  
  19. //方法一
  20. DateTime dt1 = DateTime.Now;
  21. Dictionary<string, MyData> result1 = new Dictionary<string, MyData>();
  22. foreach (MyData item in list)
  23. {
  24. MyData temp;
  25. if (!result1.TryGetValue(item.name, out temp))
  26. {
  27. result1.Add(item.name, item);
  28. }
  29. }
  30. List<MyData> r1 = result1.Values.ToList();
  31. double d1 = DateTime.Now.Subtract(dt1).TotalMilliseconds;
  32.  
  33. //方法二
  34. DateTime dt2 = DateTime.Now;
  35. List<MyData> result2 = list.ToLookup(item => item.name).ToDictionary(item => item.Key, item => item.First()).Values.ToList();
  36. double d2 = DateTime.Now.Subtract(dt2).TotalMilliseconds;
  37.  
  38. //方法三
  39. DateTime dt3 = DateTime.Now;
  40. List<MyData> result3 = list.Distinct(new MyCompare()).ToList();
  41. double d3 = DateTime.Now.Subtract(dt3).TotalMilliseconds;
  42.  
  43. //方法四
  44. DateTime dt4 = DateTime.Now;
  45. List<MyData> result4 = list.GroupBy(item => item.name).Select(item => item.First()).ToList();
  46. double d4 = DateTime.Now.Subtract(dt4).TotalMilliseconds;
  47.  
  48. this.BeginInvoke(new Action(() =>
  49. {
  50. textBox1.Text = "";
  51. textBox1.Text += "生成 " + list.Count.ToString("# ####") + " 条测试数据耗时:" + d + "毫秒\r\n\r\n";
  52. textBox1.Text += "使用方法一去重耗时:" + d1 + "毫秒\r\n\r\n";
  53. textBox1.Text += "使用ToLookup和ToDictionary去重耗时:" + d2 + "毫秒\r\n\r\n";
  54. textBox1.Text += "使用Distinct去重耗时:" + d3 + "毫秒\r\n\r\n";
  55. textBox1.Text += "使用GroupBy和Select去重耗时:" + d4 + "毫秒\r\n\r\n";
  56. textBox1.Text += "去重后数量:" + r1.Count + "," + result2.Count + "," + result3.Count + "," + result4.Count + "" + "\r\n\r\n";
  57. }));
  58. });
  59. }

数据类:

  1. public class MyData
  2. {
  3. public string id { get; set; }
  4. public string name { get; set; }
  5. }
  6.  
  7. public class MyCompare : IEqualityComparer<MyData>
  8. {
  9. public bool Equals(MyData x, MyData y)
  10. {
  11. return x.name == y.name;
  12. }
  13.  
  14. public int GetHashCode(MyData obj)
  15. {
  16. return obj.name.GetHashCode();
  17. }
  18. }

测试结果:

结论:

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

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

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

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

C# List 根据对象属性去重的四种方法对比的更多相关文章

  1. List集合对象去重及按属性去重的8种方法-java基础总结系列第六篇

    最近在写一些关于java基础的文章,但是我又不想按照教科书的方式去写知识点的文章,因为意义不大.基础知识太多了,如何将这些知识归纳总结,总结出优缺点或者是使用场景才是对知识的升华.所以我更想把java ...

  2. JavaScript数组去重的四种方法

    今天,洗澡的想一个有趣的问题,使用js给数组去重,我想了四种方法,虽然今天的任务没有完成,5555: 不多说,po代码: //方法一:简单循环去重    Array.prototype.unique1 ...

  3. 获取当前页面的所有链接的四种方法对比(python 爬虫)

    ''' 得到当前页面所有连接 ''' import requests import re from bs4 import BeautifulSoup from lxml import etree fr ...

  4. java使用反射给对象属性赋值的两种方法

    java反射无所不能,辣么,怎么通过反射设置一个属性的值呢? 主程序: /** * @author tengqingya * @create 2017-03-05 15:54 */ public cl ...

  5. Java并发编程(六):Java里实现对象安全发布的四种方式

    接上篇,首先要了解什么是对象的发布与逸出? Java里安全发布对象的四种方法1.单例(注意懒汉和饿汉的区别)2.静态属性,注意类里的静态域和静态代码块的顺序有要求3.枚举4.final

  6. php删除多重数组对象属性,重新赋值的方法

    php删除多重数组对象属性,重新赋值的方法 实例:sphinx搜索出来的结果,要去掉某个属性值:$cl = new SphinxClient ();$query = $cl->Query ( $ ...

  7. 在Action类中获得HttpServletResponse对象的四种方法

    在struts1.xAction类的execute方法中,有四个参数,其中两个就是response和request.而在Struts2中,并没有任何参数,因此,就不能简单地从execute方法获得Ht ...

  8. JavaScript对象属性访问的两种方式

    JavaScript对象属性访问的两种方式 object.attribute object["attribute"] 例如: var employees = [ { "f ...

  9. 关于数组去重的几种方法-------javascript描述

    第一种方法:借助json对象来实现,若json对象中无该属性则添加,否则不添加,最后返回json对象的属性,时间复杂度为O(n) function deleteArrayRepeat(arr) { v ...

随机推荐

  1. 复选框、单选框样式自定义(https://www.cnblogs.com/freedom-feng/p/11346396.html)

    复选框.单选框样式自定义(https://www.cnblogs.com/freedom-feng/p/11346396.html)复选框html内容如下:<input type="c ...

  2. vars()

    返回一个字典,包含所有在本函数调用时存在的变量

  3. 编译原理 算法3.8 LR分析 c++11实现

    LR分析简介 LR分析是应用最广泛的一类分析方法,它是实用的编译器功能中最强的分析器,其特点是: 1,采用最一般的无回溯移进-规约方法. 2,可分析的文法是LL文法的真超集. 3,能够及时发现错误,及 ...

  4. springboot执行延时任务-DelayQueue的使用

    DelayQueue简介 在很多场景我们需要用到延时任务,比如给客户异步转账操作超时后发通知告知用户,还有客户下单后多长时间内没支付则取消订单等等,这些都可以使用延时任务来实现. jdk中DelayQ ...

  5. A.Two Rival Students

    题目:两个竞争的学生 链接:(两个竞争的对手)[https://codeforces.com/contest/1257/problem/A] 题意:有n个学生排成一行.其中有两个竞争的学生.第一个学生 ...

  6. Day 06 作业

    目录 Python基础实战之猜数字游戏 Python进阶实战之三级菜单 Python基础实战之猜数字游戏 给定数字,用户可以猜三次年龄 数字猜对,让用户选择两次奖励 用户选择奖励后可以退出 impor ...

  7. Java中通过代码得到int类型数值的二进制形式

    一.完整代码 public class BigInteger { int sing; byte[] val; public BigInteger(int val){ // 将传递的初始值,按位取值,存 ...

  8. 【Java Web开发学习】Spring MVC文件上传

    [Java Web开发学习]Spring MVC文件上传 转载:https://www.cnblogs.com/yangchongxing/p/9290489.html 文件上传有两种实现方式,都比较 ...

  9. 《Java基础知识》Java成员变量,成员方法,构造方法和析构方法

    一 成员变量 成员变量是指类的一些属性定义,标志类的静态特征,它的基本格式如下: [访问修饰符][修饰符][类型][属性名称]= [初始值] 访问修饰符:public(公共的):protected(受 ...

  10. 《Java基础知识》Java正则表达式

    正则表达式定义了字符串的模式. 正则表达式可以用来搜索.编辑或处理文本. 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别. 正则表达式实例 一个字符串其实就是一个简单的正则表达式,例如  ...