原文:【C#】list 去重

Enumerable.Distinct 方法 是常用的LINQ扩展方法,属于System.Linq的Enumerable方法,可用于去除数组、集合中的重复元素,还可以自定义去重的规则。

有两个重载方法:

        //// 摘要: //     通过使用默认的相等比较器对值进行比较返回序列中的非重复元素。//// 参数: //   source://     要从中移除重复元素的序列。//// 类型参数: //   TSource://     source 中的元素的类型。//// 返回结果: //     一个 System.Collections.Generic.IEnumerable<T>,包含源序列中的非重复元素。//// 异常: //   System.ArgumentNullException://     source 为 null。public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source);//// 摘要: //     通过使用指定的 System.Collections.Generic.IEqualityComparer<T> 对值进行比较返回序列中的非重复元素。//// 参数: //   source://     要从中移除重复元素的序列。////   comparer://     用于比较值的 System.Collections.Generic.IEqualityComparer<T>。//// 类型参数: //   TSource://     source 中的元素的类型。//// 返回结果: //     一个 System.Collections.Generic.IEnumerable<T>,包含源序列中的非重复元素。//// 异常: //   System.ArgumentNullException://     source 为 null。public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer);    

第一个方法不带参数,第二个方法需要传一个System.Collections.Generic.IEqualityComparer<T>的实现对象

1.值类型元素集合去重

List<int> list = new List<int> { 1, 1, 2, 2, 3, 4, 5, 5 };
list.Distinct().ToList().ForEach(s => Console.WriteLine(s));

执行结果是:1 2 3 4 5

2.引用类型元素集合去重

首先自定义一个Student类

    public class Student{public string Name { get; private set; }public int Id { get; private set; }public string Hobby { get; private set; }public Student(string name, int id, string hobby){this.Name = name;this.Id = id;this.Hobby = hobby;}/// <summary>/// 方便输出,重写ToString方法/// </summary>/// <returns></returns>public override string ToString(){return string.Format("{0}\t{1}\t{2}", this.Name, this.Id, this.Hobby);}}

使用不到参数的Distinct方法去重

            List<Student> list = new List<Student>() { new Student("James",1,"Basketball"),new Student("James",1,"Basketball"),new Student("Kobe",2,"Basketball"),new Student("Curry",3,"Football"),new Student("Curry",3,"Yoga")};list.Distinct().ToList().ForEach(s => Console.WriteLine(s.ToString()));   

执行结果:

可见,并没有去除重复的记录。

不带comparer参数的Distinct方法是使用的IEqualityComparer接口的默认比较器进行比较的,对于引用类型,默认比较器比较的是其引用地址,程序中集合里的每一个元素都是个新的实例,引用地址都是不同的,所以不会被作为重复记录删除掉。

因此,我们考虑使用第二个重载方法。

新建一个类,实现IEqualityComparer接口。注意GetHashCode方法的实现,只有HashCode相同才会去比较

    public class Compare:IEqualityComparer<Student>{public bool Equals(Student x,Student y){return x.Id == y.Id;//可以自定义去重规则,此处将Id相同的就作为重复记录,不管学生的爱好是什么}public int GetHashCode(Student obj){return obj.Id.GetHashCode();}}

然后调用

list.Distinct(new Compare()).ToList().ForEach(s => Console.WriteLine(s.ToString()));

执行结果:

我们按照Id去给这个集合去重成功!

3.如何编写一个具有扩展性的去重方法

    public class Compare<T, C> : IEqualityComparer<T>{private Func<T, C> _getField;public Compare(Func<T, C> getfield){this._getField = getfield;}public bool Equals(T x, T y){return EqualityComparer<C>.Default.Equals(_getField(x), _getField(y));}public int GetHashCode(T obj){return EqualityComparer<C>.Default.GetHashCode(this._getField(obj));}}public static class CommonHelper{/// <summary>/// 自定义Distinct扩展方法/// </summary>/// <typeparam name="T">要去重的对象类</typeparam>/// <typeparam name="C">自定义去重的字段类型</typeparam>/// <param name="source">要去重的对象</param>/// <param name="getfield">获取自定义去重字段的委托</param>/// <returns></returns>public static IEnumerable<T> MyDistinct<T, C>(this IEnumerable<T> source, Func<T, C> getfield){return source.Distinct(new Compare<T, C>(getfield));}}

调用:

list.MyDistinct(s=>s.Id).ToList().ForEach(s => Console.WriteLine(s.ToString()));

用到了泛型、委托、扩展方法等知识点。可以用于任何集合的各种去重场景

转载来源:https://www.cnblogs.com/Robert-go-go/p/5399198.html

【C#】list 去重相关推荐

  1. python中排序英文单词怎么写_Python实现对文件进行单词划分并去重排序操作示例...

    本文实例讲述了Python实现对文件进行单词划分并去重排序操作.,具体如下: 文件名:test1.txt 文件内容: But soft what light through yonder window ...

  2. 对列表去重并保持原来的顺序

    首先,定义一个列表,即原列表: list1 = [0, 3, 2, 3, 1, 0, 9, 8, 9, 7]: 然后,使用set()对原列表去重list2 = list(set(list1)),得到[ ...

  3. Array 数组去重 总结10方法(7)

    1,常规双循环去重(缺点:循环次数较多) Array.prototype.unique1 = function(){if(this === null){throw new TypeError('&qu ...

  4. mysql 去重con_python 爬虫 实现增量去重和定时爬取实例

    前言: 在爬虫过程中,我们可能需要重复的爬取同一个网站,为了避免重复的数据存入我们的数据库中 通过实现增量去重 去解决这一问题 本文还针对了那些需要实时更新的网站 增加了一个定时爬取的功能: 本文作者 ...

  5. java字符串去重复_Java 8新特性:字符串去重

    本文首发与InfoQ. 8月19日,Oracle发布了JDK 8u20,JDK 8u20包含很多新特性,比如Java编译器更新.支持在运行时通过API来修改MinHeapFreeRatio和MaxHe ...

  6. stream流map 多个字段_stream流根据对象指定字段去重

    先封装一个去重的方法 import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.fun ...

  7. 字符串去重、统计不同字符种类数问题

    1.编写一个函数,计算字符串中含有的不同字符的个数.字符在ACSII码范围内(0~127),不在范围内的不作统计. #include <iostream> #include <str ...

  8. Java测试List<Object>根据其某个属性去重俩种方法效率

    需要用到根据gpsTime double类型对List进行去重: 尝试了俩种办法,就像知道耗时与性能: 1. 法一: // 根据gpsTime去重 imagePostList = imagePostL ...

  9. javascript ES6有趣的Set,数组去重、并集、交集、差集

    Set 对象存储的值总是唯一的 Set 对象方法 方法 描述 add 添加某个值,返回Set对象本身. clear 删除所有的键/值对,没有返回值. delete 删除某个键,返回true.如果删除失 ...

  10. Js面试题(一)--js实现数组去重怎么实现?

    方法1.创建一个新的临时数组来保存数组中已有的元素 方法2.使用哈希表存储已有元素 方法3.使用indexof判断数组元素第一次出现的位置是否为当前位置 方法4.先排序再去重 第一种方法和第三种方法都 ...

最新文章

  1. 构建布局良好的windows程序
  2. CListCtrl的使用完全指南
  3. java socket 连接异常_java.net.SocketException:软件导致连接中止:套接字写错误
  4. excel插入页码_Excel里毫不起眼的页眉页脚,居然有这3种高能用法!
  5. FreeEIM 与飞鸽传书的区别
  6. VB案例:多功能文本处理器
  7. NB-IoT/LoRa是新技术?其实30年前就已经出现了
  8. js 清除html页面,如何清除使用JavaScript输入的HTML文件?
  9. 生态系统类型空间分布数据/土地利用数据/植被类型数据/NPP数据/土壤侵蚀数据/土壤质地分类/降雨量栅格数据
  10. ucgui 字体生成与字体个性化编辑
  11. 基于CDD修复模型的图像修复算法
  12. 字节跳动如何用7年,成为腾讯最可怕的对手?张一鸣一语道破
  13. ACCEPTED: waiting for AM container to be allocated, launched and register with RM.
  14. VirtualBox网络配置:NAT+Host-Only实现连接外网+主机互通
  15. 青柠起始页-浏览器起始页(一个简洁、美观、实用的浏览器起始页。)
  16. 我的世界服务器总是显示错误,win 10 进mc服务器总是错误 怎么办
  17. 【两周快速入门pr】熟稔常用操作,提高剪辑效率
  18. 名帖380 张弼 草书《草书帖选》
  19. ubuntu16.04的HDMI没有输出不能外接显示器
  20. win7下玩完美玩魔兽争霸3的方法,完美解决闪屏和黑边

热门文章

  1. mybatis-plus入坑指南
  2. 进阶SQL技巧:subquery, string function, window function
  3. Python笔记_第四篇_高阶编程_检测_2.对类进行单元检测
  4. Windows安装MongoDB
  5. noip2016前的话[漫谈]
  6. 猜数字游戏,正确率为零
  7. 递归求解并生成哈夫曼编码的代码实现
  8. smarty模板截取字符串乱码问题完美解决```````
  9. php按比例截图,php 按比例生成小图函数
  10. 第十三届计算机语言学大会,第十三届全国语音学学术会议(PCC 2018) 会议通知第3号...