.NETでインプレースインターフェイスの実装を許可しないのはなぜですか?
質問
私は何かが足りないか、.NETがJavaがしていることをサポートしていません。小さなインターフェイスを実装するためだけに、小さなクラスの作成を避けることができます。たとえば、LINQの除外方法が予想されます IEqualityComparer
. 。それで、私はインターフェイスを実装する小さなクラスを書かなければなりませんでした。ただし、Javaでは、単に実行できます new IEqualityComparer() { //interface declarations }
そしてそれで終わります。だから問題は何ですか?
これはこの投稿に多少関連しています。
追加:現時点では、オーバーライドを追加しました Equals
と GetHashCode
.
解決
あなたは正しいです、c#はJavaとは異なり、インターフェイスを実装できる匿名の内部クラスの概念をサポートしていません。私はまったく同じ問題に遭遇しました IEqualityComparer
そして最終的に次の解決策に至りました。
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);
}
}
今、私がその場で欲しい場所で IEqualityComparer<T>
次のことができます
var comparer = Utils.CreateEqualityComparer<Student>(
(left, right) => left.Name == right.Name,
value => value.Name.GetHashCode());
他のヒント
簡単な答えは、これがc#.netではサポートされていないということです
私はそれがかなりきれいに聞こえるように聞こえることを認めなければなりませんが、通常、これは実際には必要ありません。 LINQの比較方法は例外であるように思われます。他のほとんどのLINQメソッドは、Lambda式を介して「インプレース」することができる代表者を使用して同じものを実行する過負荷を受け入れます。
この特定の例では、の実装があるブログ投稿の散乱があります LambdaComparer
ややエレガントな構文を使用しているにもかかわらず、これを行うことができる(または同様)。見る iComparerまたはiequalitycompererまたは単一メソッドインターフェイスの代わりにラムダ式を渡しますか? 例として。