Files
Shrlalgo.RvKits/ShrlAlgoToolkit.RevitAddins/Extensions/DistinctExtensions.cs

48 lines
1.5 KiB
C#
Raw Normal View History

2026-02-20 16:47:26 +08:00
namespace ShrlAlgoToolkit.RevitAddins.Extensions;
/// <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-20 15:31:44 +08:00
=> source.Distinct(new DistinctExtensions.DynamicEqualityComparer<T>(comparer));
public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector)
2026-02-20 15:31:44 +08:00
=> source.Distinct(new DistinctExtensions.CommonEqualityComparer<T, V>(keySelector));
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;
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));
}
}
}