我注意到 JaredPar 的回答并没有完全回答这个问题,因为像 Distinct 和 except 这样的设置方法需要一个IEqualityComparer<T>
not IComparer<T>
。下面假设一个 IEquatable 将有一个合适的 GetHashCode,它当然有一个合适的 Equals 方法。
public class GeneralComparer<T, TEquatable> : IEqualityComparer<T>
{
private readonly Func<T, IEquatable<TEquatable>> equatableSelector;
public GeneralComparer(Func<T, IEquatable<TEquatable>> equatableSelector)
{
this.equatableSelector = equatableSelector;
}
public bool Equals(T x, T y)
{
return equatableSelector.Invoke(x).Equals(equatableSelector.Invoke(y));
}
public int GetHashCode(T x)
{
return equatableSelector(x).GetHashCode();
}
}
public static class GeneralComparer
{
public static GeneralComparer<T, TEquatable> Create<T, TEquatable>(Func<T, TEquatable> equatableSelector)
{
return new GeneralComparer<T, TEquatable>(equatableSelector);
}
}
在 JaredPar 的回答中使用了来自静态类技巧的相同推理。
更笼统地说,您可以提供两个Func
s:aFunc<T, T, bool>
来检查相等性和Func<T, T, int>
选择哈希码。