IEqualityComparer<T>DistinctやExceptのようなsetメソッドはnotを必要とするため、JaredParの答えは質問に完全には答えないことに注意してください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の回答と同じ、静的クラスのトリックからの推論が使用されている場合。
より一般的には、2つFuncのsを提供できます。aはFunc<T, T, bool>同等性をチェックFunc<T, T, int>し、ハッシュコードを選択します。