Csharp/C#教程:利用Distinct()内置方法对List集合的去重问题详解分享

前言

说到对集合去重处理,第一时间想到的肯定是Linq的Distinct扩展方式,对于一般的值类型集合去重,很好处理,直接list.Distinct()即可。但是如果想要对一个引用类型的集合去重(属性值都相同就认为重复),就会发现,直接Distinct()是不行的

先来看看泛型链表List<T>的定义:

publicclassList<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枚举将会使用原有链表的最新状态。

varlist=newList<SampleVersionDto>()///表明具有重复值得集合

有时候Distinct()不能对引用类型去重时我们就要自定义了自定义代码如下:

publicclassUser { publicintId{get;set;} publicstringName{get;set;} } varlist=newList<User>() { newUser(){Id=1,Name="张三"}, newUser(){Id=1,Name="张三"}, newUser(){Id=3,Name="李四"}, }; varnewList1=list.Distinct().ToList();

运行上述代码会发现,并不是预期想要的结果,newList1还是有3个元素。之所以会产生这样的结果,是因为Distinct()是通过使用默认的相等比较器对值进行比较返回序列中的非重复元素。对于值类型,默认的相等比较器是比较值是否相等,对于引用类型,默认的相等比较器是比较对象的引用地址,所上述就是C#学习教程:利用Distinct()内置方法对List集合的去重问题详解分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/908417.html

(0)
上一篇 2021年10月25日
下一篇 2021年10月25日

精彩推荐