public static class FuncExtension
{
private class GenericComparer<T> : EqualityComparer<T>
{
private readonly Func<T, T, bool> _lambda;
private readonly bool _passThroughNulls;
public GenericComparer(Func<T, T, bool> lambda, bool passThroughNulls)
{
_lambda = lambda; _passThroughNulls = passThroughNulls;
}
public override bool Equals(T x, T y)
{
if (!_passThroughNulls)
{
if (System.Object.Equals(x, default(T)) || System.Object.Equals(y, default(T)))
{
return System.Object.Equals(x, default(T)) && System.Object.Equals(y, default(T));
}
}
return _lambda(x, y);
}
public override int GetHashCode(T obj)
{
return 0;
}
}
public static IEqualityComparer<T> ToEqualityComparer<T>(this Func<T, T, bool> lambda, bool passThroughNulls = false)
{
return new GenericComparer<T>(lambda, passThroughNulls);
}
}
Here's an example of how to use it:
Func<SomeClass, SomeClass, bool> compareFunction = (x, y) => x.SomeProperty == y.SomeProperty && x.SomeProperty2 == y.SomeProperty2; EqualityComparer<SomeClass> comparer = compareFunction.ToEqualityComparer();
No comments:
Post a Comment