测试代码:

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 根据对象属性去重的四种方法对比的更多相关文章

  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. 浅析vue混入(mixin)

    vue中的混入,可以在一定程度上提高代码的复用性.通俗来说,混入类似于“继承”,当前组件对象继承于组件对象,一般情况下遵循“就近原则”.但是与继承不同的是,继承一般都跟随着属性的重写与合并,混入在不同 ...

  2. PAT甲级专题|最短路

    PAT甲级最短路 主要算法:dijkstra 求最短最长路.dfs图论搜索. 1018,dijkstra记录路径 + dfs搜索路径最值 25分,错误点暂时找不出.. 如果只用dijkstra没法做, ...

  3. Netty学习——Netty和Protobuf的整合(一)

    Netty学习——Netty和Protobuf的整合 Protobuf作为序列化的工具,将序列化后的数据,通过Netty来进行在网络上的传输 1.将proto文件里的java包的位置修改一下,然后再执 ...

  4. 大型情感剧集Selenium:3_元素定位 #华为云·寻找黑马程序员#

    关于昨天的文章 今天有朋友反馈,代码运行的时候,selenium提示警告 DeprecationWarning: use options instead of chrome_options drive ...

  5. 什么是API文档?--斯科特·马文

    有时候,软件开发人员想要的是自己的软件被其他应用软件所应用,而不是让人来操作.API使各种应用软件互相通信成为了可能. 从事API文档写作15年,我亲眼见证了API产品的崛起.各个公司开始搭建平台,希 ...

  6. Redis 中的数据库

    前面我们花了很多的时间介绍了 redis 中基本的数据结构,及其内部的实现情况,这些都是非常基础的东西,可能不经意间你就会用到他们,希望你花点时间了解一下. 接下来,我们将走近 redis 数据库,学 ...

  7. hibernate绑定session

    session session是一种单实例对象 简单说就是自己用 别人不能用.在一些项目中很多人一起来操作 所以我们可以把session与我们的本地线程一起绑定,本地线程的特点就是执行一次 从创建到销 ...

  8. Preact(React)核心原理详解

    原创: 宝丁 玄说前端 本文作者:字节跳动 - 宝丁 一.Preact 是什么 二.Preact 和 React 的区别有哪些? 三.Preact 是怎么工作的 四.结合实际组件了解整体渲染流程 五. ...

  9. git删除中间某次提交

    git log获取commit信息 commit 58211e7a5da5e74171e90d8b90b2f00881a48d3a Author: test <test@36nu.com> ...

  10. windows下RocketMQ下载安装教程

    一.下载(原文链接:http://www.studyshare.cn/software/details/1183/0 ) 1.官网下载:下载地址   2.百度网盘下载:下载地址 提取码:0g5a ja ...