Either I am missing something or .NET doesn't support what Java does. I'd like to be able to avoid creating a small class just for the sake of implementing a small interface. For example, LINQ's Except method expects IEqualityComparer
. So I had to write a small class that implements the interface. However in Java I can simply do a new IEqualityComparer() { //interface declarations }
and be done with it. So what's the problem?
This is somewhat related to this post:
Can a C# anonymous class implement an interface?.
ADDITION:
At the moment, I added overrides for Equals
and GetHashCode
.
You're correct, C# unlike Java, does not support the notion of anonymous inner classes which can implement interfaces. I've run into the exact same problem with IEqualityComparer
and eventually came to the following solution.
public static class Utils {
private sealed class EqualityComparer<T> : IEqualityComparer<T> {
private readonly Func<T, T, bool> m_equals;
private readonly Func<T, int> m_getHashCode;
internal EqualityComparer(
Func<T, T, bool> equals,
Func<T, int> getHashCode) {
m_equals = equals;
m_getHashCode = getHashCode;
}
public bool Equals(T left, T right) {
return m_equals(left, right);
}
public int GetHashCode(T value) {
return m_getHasheCode(value);
}
}
public static IEqualityComparer<T> CreateEqualityComparer<T>(
Func<T, T, bool> equals,
Func<T, int> getHashCode) {
return new EqualityComparer<T>(equals, getHashCode);
}
}
Now in places where I want an on the fly IEqualityComparer<T>
i can just do the following
var comparer = Utils.CreateEqualityComparer<Student>(
(left, right) => left.Name == right.Name,
value => value.Name.GetHashCode());