Occasionally I like to just get something done with some Lambda expressions that probably should be more properly architected.
In case someone else feels like doing something a little naughty with Lambda expressions, here is an example of what I call a DelegableEqualityComparer that will take as parameters the equality function to use and the function to generate a HashCode.
Disclaimer: I didn't say it's the right way, just that it might be useful sometime.
public class DelegableEqualityComparer<T> : IEqualityComparer<T>
{
private Func<T, T, bool> equalsFunc;
private Func<T, int> hashFunc;
public DelegableEqualityComparer(Func<T,T,bool> EqualityFunction, Func<T, int> HashFunction)
{
equalsFunc = EqualityFunction;
hashFunc = HashFunction;
}
#region IEqualityComparer<T> Members
public bool Equals(T x, T y)
{
return equalsFunc.Invoke(x, y);
}
public int GetHashCode(T obj)
{
return hashFunc.Invoke(obj);
}
#endregion
}
// Example of inheriting for simple comparers.
public class ValidationResultMessageComparer :
DelegableEqualityComparer<ValidationResult>
{
public ValidationResultMessageComparer()
: base(
// Equality Comparer
(x, y) => String.Equals(x.Message, y.Message),
// HashCode
(o) => o.Message.GetHashCode()
)
{
}
}
// Example of using in-line
foreach ( var result in results.Distinct(new DelegableEqualityComparer<ValidationResult>((x,y) => x.Message.Equals(y.Message), o => o.Message.GetHashCode())))
{
// Your distinct results...
}
Now Playing: Rick Ross - Hustlin' Remix
No comments:
Post a Comment