| public static partial class Comparers
{
public static EqualityComparer<T> Create<T>(Func<T, T, bool> comparison, Func<T, int> hashCode) {
Argument.NotNull(comparison, "comparison");
Argument.NotNull(hashCode, "hashCode");
return new ComparisonEqualityComparer<T>(comparison, hashCode);
}
public static EqualityComparer<T> Create<T>(Func<T, T, bool> equals) {
Argument.NotNull(equals, "equals");
return Create(equals, EqualityComparer<T>.Default.GetHashCode);
}
public static EqualityComparer<TOutput> Convert<TInput, TOutput>(this IEqualityComparer<TInput> comparer, Converter<TOutput, TInput> converter) {
Argument.NotNull(comparer, "comparer");
Argument.NotNull(converter, "converter");
Func<TOutput, TOutput, bool> comparison = (x, y) => comparer.Equals(converter(x), converter(y));
Func<TOutput, int> hashCode = x => comparer.GetHashCode(converter(x));
return Create(comparison, hashCode);
}
[Serializable]
private sealed class ComparisonEqualityComparer<T> : EqualityComparer<T>
{
public ComparisonEqualityComparer(Func<T, T, bool> comparison, Func<T, int> hashCode) {
Argument.NotNull(comparison, "comparison");
Argument.NotNull(hashCode, "hashCode");
Comparison = comparison;
HashCode = hashCode;
}
private Func<T, T, bool> Comparison{get;set;}
private Func<T, int> HashCode {get;set;}
[ContractInvariantMethod]
private void Invariant() {
Contract.Invariant(Comparison != null);
Contract.Invariant(HashCode != null);
}
public override bool Equals(T x, T y) {
return Comparison(x, y);
}
public override int GetHashCode(T obj) {
return HashCode(obj);
}
}
}
|