zoukankan      html  css  js  c++  java
  • C# 扩展方法——去重(Distinct)

    其他扩展方法详见:https://www.cnblogs.com/zhuanjiao/p/12060937.html

    IEnumerable的Distinct扩展方法,当集合元素为对象时,可用于元素对象指定字段进行排重集

    一、通过指定单个属性进行去重。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace CoSubject.Common.CommonExtensions
    {
    	/// <summary>
    	/// IEnumerable的Distinct扩展方法
    	/// 当集合元素为对象时,可用于元素对象指定字段进行排重集
    	/// </summary>
    	public static class DistinctExtensions
    	{
    		public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector)
    		{
    			return source.Distinct(new CommonEqualityComparer<T, V>(keySelector));
    		}
    
    		public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source,  
                    Func<T, V> keySelector, IEqualityComparer<V> comparer)
    		{
    			return source.Distinct(new CommonEqualityComparer<T, V>(keySelector, comparer));
    		}
    	}
    
    	public class CommonEqualityComparer<T, V> : IEqualityComparer<T>
    	{
    		private Func<T, V> keySelector;
    		private IEqualityComparer<V> comparer;
    
    		public CommonEqualityComparer(Func<T, V> keySelector, IEqualityComparer<V> comparer)
    		{
    			this.keySelector = keySelector;
    			this.comparer = comparer;
    		}
    
    		public CommonEqualityComparer(Func<T, V> keySelector) : this(keySelector, EqualityComparer<V>.Default)
    		{ }
    
    		public bool Equals(T x, T y)
    		{
    			return comparer.Equals(keySelector(x), keySelector(y));
    		}
    
    		public int GetHashCode(T obj)
    		{
    			return comparer.GetHashCode(keySelector(obj));
    		}
    	}
    }
    

      

    举例:

    var member = memberAll.Distinct(d => d.MemberID); // 按照MemberID进行排重,不区分大小写

    var member = memberAll.Distinct(d => d.MemberID, StringComparer.CurrentCultureIgnoreCase);// 不区分大小写

    两个参数的扩展方法,第二个参数有以下几种可选。

    二、若是对多个属性去重如何实现呢?

    思路:主要是去实现IEqualityComparer<T> 泛型接口中的两个方法,Equals和GetHashCode,根据自己的需求去返回真假

    具体实现参照https://www.zhangshengrong.com/p/JKN8Eqo2X6/

    因为对象在比较的时候,会先调用GetHashCode方法,

    若HashCode不同 ,则对象不同,不会调用Equlas方法,

    若HashCode相同,再调用Equlas方法进行比较

    文章里面就是: 让GetHashCode方法返回常量,触发Equlas方法进行比较,Equlas里面写了自己所需要排重的属性进行判断

    三、排重是否有其他方式可以实现?

    有,memberAll.Where((m,i)=>memberAll.FindIndex(z=>z.MemberID== m.MemberID) == i) 

    另,GroupBy 可以实现

  • 相关阅读:
    strdup和strndup函数
    c# 获取客户端IP地址方法
    The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.报错解决办法
    C#将Excel数据表导入SQL数据库的两种方法(转)
    Winform 无法监听方向键(向上,向下,向左,向右)
    一个优秀的.net程序员必须要学会的技能 (转)-----参照学习目标
    iTextSharp 使用详解(转)
    mac 快捷键
    mvc 项目运行报错检查web.config
    C语言堆栈入门——堆和栈的区别 -- 转
  • 原文地址:https://www.cnblogs.com/zhuanjiao/p/12082054.html
Copyright © 2011-2022 走看看