namespace ShrlAlgoToolkit.RevitAddins.Common.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));
}
}
}