C# 扩展方法——去重(Distinct)

2021-01-22 08:12

阅读:629

标签:调用   names   blank   cos   comm   ring   ali   key   bool   

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

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

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

using System;
using System.Collections.Generic;
using System.Linq;

namespace CoSubject.Common.CommonExtensions
{
	/// 
	/// IEnumerable的Distinct扩展方法
	/// 当集合元素为对象时,可用于元素对象指定字段进行排重集
	/// 
	public static class DistinctExtensions
	{
		public static IEnumerable Distinct(this IEnumerable source, Func keySelector)
		{
			return source.Distinct(new CommonEqualityComparer(keySelector));
		}

		public static IEnumerable Distinct(this IEnumerable source,  
                Func keySelector, IEqualityComparer comparer)
		{
			return source.Distinct(new CommonEqualityComparer(keySelector, comparer));
		}
	}

	public class CommonEqualityComparer : IEqualityComparer
	{
		private Func keySelector;
		private IEqualityComparer comparer;

		public CommonEqualityComparer(Func keySelector, IEqualityComparer comparer)
		{
			this.keySelector = keySelector;
			this.comparer = comparer;
		}

		public CommonEqualityComparer(Func keySelector) : this(keySelector, EqualityComparer.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 泛型接口中的两个方法,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 可以实现

 

C# 扩展方法——去重(Distinct)

标签:调用   names   blank   cos   comm   ring   ali   key   bool   

原文地址:https://www.cnblogs.com/zhuanjiao/p/12082054.html


评论


亲,登录后才可以留言!