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 可以实现

  • 相关阅读:
    什么是根文件系统
    构建基本的嵌入式Linux根文件系统
    “文件系统”与“根文件系统”详解
    C#中NameValueCollection类用法详解
    别把西红柿连续种在同一块地里
    asp.net 服务器控件的 ID,ClientID,UniqueID 的区别
    不要为框架作过多的假设
    构件技术
    asp.net中控件id,clientid,uniqueid的区别
    系统架构图怎么画
  • 原文地址:https://www.cnblogs.com/zhuanjiao/p/12082054.html
Copyright © 2011-2022 走看看