namespace ShrlAlgoToolkit.Core.Extensions; /// /// 自定义Distinct扩展方法 /// public static class DistinctExtensions { public static IEnumerable Distinct( this IEnumerable source, Func comparer) where T : class => source.Distinct(new DynamicEqualityComparer(comparer)); public static IEnumerable Distinct(this IEnumerable source, Func keySelector) => source.Distinct(new CommonEqualityComparer(keySelector)); private sealed class DynamicEqualityComparer : IEqualityComparer where T : class { private readonly Func _func; public DynamicEqualityComparer(Func func) { _func = func; } public bool Equals(T x, T y) => _func(x, y); public int GetHashCode(T obj) => 0; } private sealed class CommonEqualityComparer : IEqualityComparer { private readonly Func keySelector; public CommonEqualityComparer(Func keySelector) { this.keySelector = keySelector; } public bool Equals(T x, T y) { return EqualityComparer.Default.Equals(keySelector(x), keySelector(y)); } public int GetHashCode(T obj) { return EqualityComparer.Default.GetHashCode(keySelector(obj)); } } }