没有合适的资源?快使用搜索试试~ 我知道了~
利用Distinct()内置方法对List集合的去重问题详解
9 下载量 26 浏览量
2020-08-25
23:11:24
上传
评论
收藏 72KB PDF 举报
温馨提示
试读
2页
主要给大家介绍了关于利用Distinct()内置方法对List集合的去重问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
资源推荐
资源详情
资源评论
利用利用Distinct()内置方法对内置方法对List集合的去重问题详解集合的去重问题详解
主要给大家介绍了关于利用Distinct()内置方法对List集合的去重问题的相关资料,文中通过示例代码介绍的非常
详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
前言前言
说到对集合去重处理,第一时间想到的肯定是Linq的Distinct扩展方式,对于一般的值类型集合去重,很好处理,直接
list.Distinct()即可。但是如果想要对一个引用类型的集合去重(属性值都相同就认为重复),就会发现,直接Distinct()是不行
的
先来看看泛型链表 List<T> 的定义:
public class List<T> : IList<T>, ICollection<T>, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>,
IEnumerable<T>, IEnumerable
可见它实现了 IEnumerable<T>,而IEnumerable<T>规定了Distinct方法。
使用这个方法时要注意:使用这个方法时要注意:
(1)该方法并不会改变原来的链表;
(2)该方法返回一个对象(假设叫做dis),通过该对象可以枚举原链表中的非重复元素,但是并没有把非重复元素复制一份
到新的对象中(连签拷贝也没有)
(3)由于(2),在枚举dis时,始终是依赖于原有链表,所以如果在获得dis后,又更新了原有链表,那么使用dis枚举将会使
用原有链表的最新状态。
var list=new List<SampleVersionDto>()///表明具有重复值得集合
有时候Distinct()不能对引用类型去重时 我们就要自定义了 自定义代码如下:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
var list = new List<User>()
{
new User() { Id = 1, Name = "张三" } ,
new User() { Id = 1, Name = "张三" } ,
new User() { Id = 3, Name = "李四" } ,
};
var newList1 = list.Distinct().ToList();
运行上述代码会发现,并不是预期想要的结果,newList1还是有3个元素。之所以会产生这样的结果,是因为Distinct()是通过
使用默认的相等比较器对值进行比较返回序列中的非重复元素。对于值类型,默认的相等比较器是比较值是否相等,对于引用
类型,默认的相等比较器是比较对象的引用地址,所以上述例子中即使属性值都相同,也不能去重。
IEqualityComparer<TSource>
聪明的我们,很容易就能发现,Linq已经为我们重载了一个去重方法,可以满足我们的需求:
public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer);
重载的这个方法,多提供了一个参数IEqualityComparer<TSource> comparer,是一个泛型接口,我们只需要对这个接口进行
实现,即可满足我们的去重需求:
public class UserComparer : IEqualityComparer<User>
{
public bool Equals(User x, User y)
{
return x.Id == y.Id && x.Name == y.Name;
}
public int GetHashCode(User obj)
{
return obj.ToString().GetHashCode();
}
}
IEqualityComparer<TSource> 定义了两个方法,一个是Equals,一个是GetHashCode。这里我查找参考资料发现,进行比较
资源评论
weixin_38577648
- 粉丝: 3
- 资源: 943
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- SRS-CentOS7-x86-64-5.0-r1.zip
- 全文检索使用ElasticSearch实现全文检索的详细说明和实践探索
- Python《基于TensorFlow的人脸识别(面部表情识别)卷积神经网络 》+源代码+文档说明
- Python《利用bert预训练的中文模型进行文本分类 数据集中文情感分析语料》+源代码+文档说明
- Keil MDK主题美化和代码美化
- 《单片机PID算法的恒温控制系统仿真与程序源码设计(DS18B20传感器) 》+源代码
- 基于matlab小波变换图像压缩系统代码15
- 基于matlab主成分分析图像压缩重建系统代码14
- C语言《基于AT89C52单片机搭建的PID直流电机控制程序,主要用于Proteus电路仿真》+源代码
- C++《基于规划和汽车动力学的自动驾驶项目仿真(基于ROS的自动驾驶项目仿真,使用DWA路径规划算法和双PID控制器)》+源代码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功