public class FuncEqualityComparer<T> :
FuncComparer<T>,
IEqualityComparer,
IEqualityComparer<T>
{
private readonly Func<T, int> getHashCode = null;
public FuncEqualityComparer(
Comparison<T> comparison,
Func<T, int> getHashCode,
bool isNullLessThan = true) :
this(new[] { comparison, }, getHashCode, isNullLessThan)
{
}
public FuncEqualityComparer(
Comparison<T>[] comparisons,
Func<T, int> getHashCode,
bool isNullLessThan = true) :
base(comparisons, isNullLessThan)
{
this.getHashCode = getHashCode;
}
// interfaces
#region IEqualityComparer Members
public new bool Equals(object x, object y)
{
int comparison = Compare(x, y);
bool isEqual = comparison == 0;
return isEqual;
}
public int GetHashCode(object obj)
{
int hashCode = 0;
T o = default(T);
if (obj is T)
{
o = (T)(obj);
}
hashCode = getHashCode(o);
return hashCode;
}
#endregion
#region IEqualityComparer<T> Members
public bool Equals(T x, T y)
{
int comparison = Compare(x, y);
bool isEqual = comparison == 0;
return isEqual;
}
public int GetHashCode(T obj)
{
int hashCode = getHashCode(obj);
return hashCode;
}
#endregion
}
No real secret sauce here; merely account for GetHashCode and interpret an underlying comparison.