当前位置:
首页 > Python基础教程 >
-
C#教程之List对象去重碎碎念之神叨叨
前言
List集合操作去除重复数据的这种情况经常会碰到,博客园里面也有很多大神们做过,在这里主要是借鉴然后自己整理了一下,主要是为了方便自己,以后再次碰到这种去重问题,直接打开自己的链接拿起键盘就是干,,,,
一、方法一
利用HashSet去重,在实体类里重写Equals和GetHashCode方法
class Program { static void Main(string[] args) { List<UserInfo> list = new List<UserInfo>() { new UserInfo() { Id="1", UserName="111"}, new UserInfo() { Id="1", UserName="111"} }; // 因为我们通常操作的是List集合,所以我在这里把list转成了HashSet类型来接受 HashSet<UserInfo> hs = new HashSet<UserInfo>(list); foreach (var item in hs) { Console.WriteLine($"Id:{item.Id} UserName:{item.UserName}"); } Console.ReadKey(); } class UserInfo { public string Id { get; set; } public string UserName { get; set; } public override bool Equals(object obj) { UserInfo user = obj as UserInfo; return this.Id == user.Id ; } public override int GetHashCode() { return this.Id.GetHashCode(); } } }
二、方法二
利用拉姆达表达式Distinct方法,我们转到定义可以看到两个重载的Distinct方法,如图
我们再转到定义看看IEqualityComparer接口里面到底是个啥玩意,原来有两个方法
这时候我们来实现IEqualityComparer接口里面的方法
class Program { static void Main(string[] args) { UserInfo info = new UserInfo(); List<UserInfo> list = new List<UserInfo>() { new UserInfo() { Id="1", UserName="111"}, new UserInfo() { Id="1", UserName="111"} }; list.Distinct(new DistinctCompare()).ToList().ForEach(item => { Console.WriteLine($"Id:{item.Id} UserName:{item.UserName}"); }); Console.ReadKey(); } class UserInfo { public string Id { get; set; } public string UserName { get; set; } } class DistinctCompare : IEqualityComparer<UserInfo> { public bool Equals(UserInfo x, UserInfo y) { return x.Id == y.Id;//可以自定义去重规则,此处将Id相同的就作为重复记录 } public int GetHashCode(UserInfo obj) { return obj.Id.GetHashCode(); } } }
我们再来写一个通用的扩展方法
帮助类
public static class DistinctHelper { /// <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> DistinctEx<T, C>(this IEnumerable<T> source, Func<T, C> getfield) { return source.Distinct(new Compare<T, C>(getfield)); } } 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)); } }
实现
class Program { static void Main(string[] args) { UserInfo info = new UserInfo(); List<UserInfo> list = new List<UserInfo>() { new UserInfo() { Id="1", UserName="111"}, new UserInfo() { Id="1", UserName="111"} }; list.DistinctEx(x => x.Id).ToList().ForEach(item => { Console.WriteLine($"Id:{item.Id} UserName:{item.UserName}"); }); Console.ReadKey(); } class UserInfo { public string Id { get; set; } public string UserName { get; set; } } }
三、方法三
利用拉姆达表达式一句话即可
class Program { static void Main(string[] args) { List<UserInfo> list = new List<UserInfo>() { new UserInfo() { Id="1", UserName="111"}, new UserInfo() { Id="1", UserName="111"} }; // 用拉姆达表达式一句话即可实现去重 var result = list.Where((x,i)=>list.FindIndex(y=>y.Id==x.Id)==i); result.ToList().ForEach(item=> { Console.WriteLine($"Id:{item.Id} UserName:{item.UserName}"); }); Console.ReadKey(); } class UserInfo { public string Id { get; set; } public string UserName { get; set; } } }
权责申明
作者:SportSky 出处: http://www.cnblogs.com/sportsky/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式