C# List 根据对象属性去重的四种方法对比
测试代码:
private void TestDistinct()
{
Task.Run(() =>
{
//生成测试数据
DateTime dt = DateTime.Now;
Random rnd = new Random();
List<MyData> list = new List<MyData>();
int total = ;
for (int i = ; i < total; i++)
{
MyData info = new MyData();
info.id = rnd.Next(, total * ).ToString();
info.name = rnd.Next(, total * ).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();
}
}
测试结果:

结论:
方法一和方法三去重速度差不多,在一个数量级
方法二和方法四去重速度差不多,在一个数量级
方法二和方法四比方法一和方法三大约慢4、5倍左右
方法二和方法四比较方便,一行代码搞定,方法一和方法三代码行数相对较多,方法三要写个MyCompare
C# List 根据对象属性去重的四种方法对比的更多相关文章
- List集合对象去重及按属性去重的8种方法-java基础总结系列第六篇
最近在写一些关于java基础的文章,但是我又不想按照教科书的方式去写知识点的文章,因为意义不大.基础知识太多了,如何将这些知识归纳总结,总结出优缺点或者是使用场景才是对知识的升华.所以我更想把java ...
- JavaScript数组去重的四种方法
今天,洗澡的想一个有趣的问题,使用js给数组去重,我想了四种方法,虽然今天的任务没有完成,5555: 不多说,po代码: //方法一:简单循环去重 Array.prototype.unique1 ...
- 获取当前页面的所有链接的四种方法对比(python 爬虫)
''' 得到当前页面所有连接 ''' import requests import re from bs4 import BeautifulSoup from lxml import etree fr ...
- java使用反射给对象属性赋值的两种方法
java反射无所不能,辣么,怎么通过反射设置一个属性的值呢? 主程序: /** * @author tengqingya * @create 2017-03-05 15:54 */ public cl ...
- Java并发编程(六):Java里实现对象安全发布的四种方式
接上篇,首先要了解什么是对象的发布与逸出? Java里安全发布对象的四种方法1.单例(注意懒汉和饿汉的区别)2.静态属性,注意类里的静态域和静态代码块的顺序有要求3.枚举4.final
- php删除多重数组对象属性,重新赋值的方法
php删除多重数组对象属性,重新赋值的方法 实例:sphinx搜索出来的结果,要去掉某个属性值:$cl = new SphinxClient ();$query = $cl->Query ( $ ...
- 在Action类中获得HttpServletResponse对象的四种方法
在struts1.xAction类的execute方法中,有四个参数,其中两个就是response和request.而在Struts2中,并没有任何参数,因此,就不能简单地从execute方法获得Ht ...
- JavaScript对象属性访问的两种方式
JavaScript对象属性访问的两种方式 object.attribute object["attribute"] 例如: var employees = [ { "f ...
- 关于数组去重的几种方法-------javascript描述
第一种方法:借助json对象来实现,若json对象中无该属性则添加,否则不添加,最后返回json对象的属性,时间复杂度为O(n) function deleteArrayRepeat(arr) { v ...
随机推荐
- .Net Core3.1下使用Swagger搭建web api项目
前言:微软于前天发布.net core 3.1正式版,并将长期支持3.1.所以我听到这个消息后就急忙下载.net core 3.1的SDK和Runtime,应该是公司最先用3.1的攻城狮了
- 不服跑个分:ARM鲲鹏云服务器实战评测——华为云鲲鹏KC1实例 vs. 阿里云G5实例【华为云技术分享】
原文链接:https://m.ithome.com/html/444828.htm 今年一月份,华为正式发布了鲲鹏920数据中心高性能处理器,该处理器兼容ARM架构,采用7纳米制造,最高支持64核,主 ...
- pringBoot-MongoDB 索引冲突分析及解决【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- 关于Python的随机数模块,你必须要掌握!
所谓七夕 前几天的文章这个七夕节,用Python为女友绘制一张爱心照片墙吧!收获了最近以来最高的浏览量,没枉费我熬到夜里3点赶出来的热点文章.有付出就总会有所回报,只是看这天来的早晚而已.七夕一个人看 ...
- 求亿级记录中搜索次数Top N的搜索词(MapReduce实现)
程序事例: 日志信息: 二手车 1345 二手房 3416 洗衣机 2789 输入: N=2 输出: 二手房 洗衣机 map函数如下: import java.io.IOException; impo ...
- P2910 [USACO08OPEN]寻宝之路Clear And Present Danger |Floyd
题目描述 农夫约翰正驾驶一条小艇在牛勒比海上航行. 海上有N(1≤N≤100)个岛屿,用1到N编号.约翰从1号小岛出发,最后到达N号小岛. 一张藏宝图上说,如果他的路程上经过的小岛依次出现了Ai,A2 ...
- 消息通知机制(NSNotification和NSNotificationCenter)
作者:FlyElephant 出处:http://www.cnblogs.com/xiaofeixiang iOS中委托模式和消息机制基本上开发中用到的比较多,一般最开始页面传值通过委托实现的比较多, ...
- hdu3015,poj1990树状数组
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3015 题意:给定n组数,每组数有值x和值h,求n组数两两的val的总和.将所有x和所有h分别离散化(不 ...
- POJ1704 Georgia and Bob(Nim博弈变形)
Georgia and Bob Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14312 Accepted: 4840 ...
- Codevs-4919 线段树练习4(区间加上一个值并求摸个区间整除k的数的个数,线段树+数组维护)
给你N个数,有两种操作 1:给区间[a,b]内的所有数都增加X 2:询问区间[a,b]能被7整除的个数 输入描述 Input Description 第一行一个正整数n,接下来n行n个整数,再接下来一 ...