2026-02-21 16:31:24 +08:00
|
|
|
|
namespace ShrlAlgoToolkit.RevitAddins.Common.Extensions;
|
2025-02-10 20:53:40 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 自定义Distinct扩展方法
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static class DistinctExtensions
|
|
|
|
|
|
{
|
|
|
|
|
|
public static IEnumerable<T> Distinct<T>(
|
|
|
|
|
|
this IEnumerable<T> source, Func<T, T, bool> comparer)
|
|
|
|
|
|
where T : class
|
2026-02-24 11:34:18 +08:00
|
|
|
|
=> source.Distinct(new DynamicEqualityComparer<T>(comparer));
|
2025-02-10 20:53:40 +08:00
|
|
|
|
public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector)
|
2026-02-24 11:34:18 +08:00
|
|
|
|
=> source.Distinct(new CommonEqualityComparer<T, V>(keySelector));
|
2025-02-10 20:53:40 +08:00
|
|
|
|
private sealed class DynamicEqualityComparer<T> : IEqualityComparer<T>
|
|
|
|
|
|
where T : class
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly Func<T, T, bool> _func;
|
|
|
|
|
|
|
|
|
|
|
|
public DynamicEqualityComparer(Func<T, T, bool> func)
|
|
|
|
|
|
{
|
|
|
|
|
|
_func = func;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public bool Equals(T x, T y) => _func(x, y);
|
|
|
|
|
|
|
|
|
|
|
|
public int GetHashCode(T obj) => 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private sealed class CommonEqualityComparer<T, V> : IEqualityComparer<T>
|
|
|
|
|
|
{
|
2025-07-31 20:12:24 +08:00
|
|
|
|
private readonly Func<T, V> keySelector;
|
2025-02-10 20:53:40 +08:00
|
|
|
|
|
|
|
|
|
|
public CommonEqualityComparer(Func<T, V> keySelector)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.keySelector = keySelector;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public bool Equals(T x, T y)
|
|
|
|
|
|
{
|
|
|
|
|
|
return EqualityComparer<V>.Default.Equals(keySelector(x), keySelector(y));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public int GetHashCode(T obj)
|
|
|
|
|
|
{
|
|
|
|
|
|
return EqualityComparer<V>.Default.GetHashCode(keySelector(obj));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|