C# distnict去重

简介: C# distnict去重

在C#中,使用distinct的时候,会发现有些情况不好使,比如我是泛型集合的时候,发现没去掉重复。这是因为对于引用类型,distinct里的默认比较器比较的是其引用地址,程序中集合里的每一个元素都是个新的实例,引用地址都是不同的,所以不会被作为重复记录删除掉。因此我们需要自定义比较器进行去重,实现指定条件去重复。


本章主要讲解如何设计比较器。我们先来看看第一版:

public class JuryComparer: IEqualityComparer<T_S_SalesPointModel>
    {
        public bool Equals(T_S_SalesPointModel x, T_S_SalesPointModel y)
        { 
            return x.ClientCode.Equals(y.ClientCode);
        }
        public int GetHashCode(T_S_SalesPointModel obj)
        {
            return 0;
        }
    }


使用的时候很简单,.Distinct(new JuryComparer()),在distinct里实例化这个参数传入即可。


但是很快我们就发现一个问题,我们别的业务里也需要用到这个,如果作为一个公共方法,显然我是不能把model指定死的,所以有了第二版:


public class JuryComparer<T> : IEqualityComparer<T>
    {
        public bool Equals(T x, T y)
        {
            dynamic dx = x;
            dynamic dy = y; 
            return dx.ClientCode.Equals(dy.ClientCode);
        }
        public int GetHashCode(T obj)
        {
            return 0;
        }
    }


通过泛型T我们可以在方法内部不指定具体类型,这样就方法就能自适应不同的model了。

  

然鹅,今天遇到一种情况,即,我们自定义的方法中,是通过ClientCode去做比较的,如果外部model中不存在这个Code,那我们就无法比较,因为方法会报错,提示没有这个属性。也就是说我们的通用方法除了model需要通用以外,这个属性,应该从外部传进来,那么如何实现呢,请看第三版:


public class JuryComparer<T> : IEqualityComparer<T>
    {
        private string _attribute;
        public JuryComparer(string attribute)
        {
            _attribute = attribute;
        }
        public bool Equals(T x, T y)
        {
            dynamic dx = x;
            dynamic dy = y;
            var vx = dx.GetType().GetProperty(_attribute).GetValue(dx, null);
            var vy = dy.GetType().GetProperty(_attribute).GetValue(dy, null);
            return vx.Equals(vy);
        }
        public int GetHashCode(T obj)
        {
            return 0;
        }
    }


通过构造函数传参,我们将外部参数赋值给内部私有变量,最后在比较方法里, 我们通过反射获取属性实现自适应。这样外部就能通过这种方式实现调用:


.Distinct(new JuryComparer<TreeModel>("value"))


既可以传入不同的model,又可以传入不同的属性。


以上。


PS:楼主邮箱 tccwpl@163.com

目录
相关文章
|
4天前
|
开发框架 .NET C#
C#数据去重的这几种方式,你知道几种?
C#数据去重的这几种方式,你知道几种?
|
8月前
|
开发框架 .NET C#
C#数据去重的这几种方式,你知道几种?
C#数据去重的这几种方式,你知道几种?
|
6月前
|
C#
c#集合去重&排序常用方法
list和数组转Hashset跟SortedSet进行排序和去重,以及当Hashset和SortedSet存放的是类时如何进行自定义的排序和去重
51 2
|
C# .NET 开发框架
【C#】list 去重
原文:【C#】list 去重   Enumerable.Distinct 方法 是常用的LINQ扩展方法,属于System.Linq的Enumerable方法,可用于去除数组、集合中的重复元素,还可以自定义去重的规则。
5403 0
|
C# 数据建模
C# datatable中重复数据去重
#region datatable去重 /// &lt;summary&gt; /// datatable去重 /// &lt;/summary&gt; /// &lt;param name="dtSource"&gt;需要去重的datatable&lt;/param&gt; /// &lt;param na
1251 0
|
C# 数据建模
C# datatable中重复数据去重
#region datatable去重 /// &lt;summary&gt; /// datatable去重 /// &lt;/summary&gt; /// &lt;param name="dtSource"&gt;需要去重的datatable&lt;/param&gt; /// &lt;param na
4134 0
|
C#
C#实现大数据量TXT文本数据快速高效去重
原文 C#实现大数据量TXT文本数据快速高效去重对几千万的TXT文本数据进行去重处理,查找其中重复的数据,并移除。尝试了各种方法,下属方法是目前尝试到最快的方法。以下代码将重复和不重复数据进行分文件存放,提升效率的关键是用到了HashSet。
1976 0
|
4天前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
|
4天前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。