辞書のContainsKey()メソッドが機能しません - どうすれば "GetHashCode()"をオーバーライドして動作させることができますか?キーが単純なプリミティブ型でないときにContainsKey()を使用する
答えて
等価を示すには、GetHashCode()
とEquals()
の両方を上書きする必要があります。たとえば、次のように
public sealed class MyType : IEquatable<MyType> {
private readonly int foo;
private readonly string bar;
public int Foo { get { return foo; } }
public string Bar { get { return bar; } }
public MyType(int foo, string bar) {
this.foo = foo; this.bar = bar;
}
public bool Equals(MyType other) {
if(other == null) return false;
return other.foo == this.foo && other.bar == this.bar;
}
public override bool Equals(object other) {
return Equals(other as MyType);
}
public override int GetHashCode() {
int result = 29;
result = result * 13 + foo.GetHashCode();
result = result * 13 + (bar == null ? 0 : bar.GetHashCode());
return result;
}
}
注IEquatable<T>
は完全に任意であるが、それは箱を避ける構造体のために特に有用であること。注意:平等を定義する部分が不変の場合、それは命を救うでしょう。
はbool Equals(オブジェクトother)とGetHashCodeをオーバーライドする必要があります – Manatherin
彼は必ずしもメソッドをオーバーライドする必要はありませんが、等価比較関数が提供されるDictionaryコンストラクタのオーバーロードがあります。 –
@Manatherinはい、彼らはすべきです - 私の悪い! –
、あなたのアイテムのクラスに必要なメソッド(GetHashCode()
とEquals()
)をオーバーライドする方法がありません場合は、あなたがIEqualityComparer<T>
の比較を実行するために提供することができ、辞書のコンストラクタがあります。その後、元のクラスに触れることなく、これらのメソッドの実装を提供することができます。
class FooEqualityComparer : IEqualityComparer<Foo>
{
public bool Equals(Foo x, Foo y)
{
// implement Equals between x and y
}
public int GetHashCode(Foo obj)
{
// implement GetHashCode for obj
}
}
class Foo
{
// fields, properties, methods, etc.
}
// a dictionary that can use Foo's as keys
var myFooDict = new Dictionary<Foo, object>(new FooEqualityComparer())
{
// ...
};
// use it like normal
if (myFooDict.ContainsKey(someFoo)) // the comparison will be handled by the comparer provided from the constructor
{
// do stuff...
}
- 1. 単純なプリミティブ型のシンボルを見つけることができない
- 2. 一種の単純な多型に使用できますか?
- 3. Rubyの単純なオブジェクトインスタンスがプリミティブを返すことはできますか?
- 4. エクトは、どのように私はちょっと単純なモデルを持っていないプリミティブ型
- 5. なぜKotlinはプリミティブ型のlateinitを使用できないのですか?
- 6. Ecto単純な外部キー
- 7. ClassLoaderでプリミティブ型を使用
- 8. 単純なメッシュを表示したいときにThree.jsが単純なキューブを表示しない
- 9. tqdmが利用できない場合の単純なフォールバック・プログレスバー
- 10. 単純なトランザクションにsocket.ioを使用できますか?
- 11. 単純なASP.NETソリューションにSQL Azureを使用できますか?
- 12. ComboBoxStyleを使用したDataGridViewComboBoxCell単純な入力キーのキャッチ
- 13. 単純なデリゲートの使用
- 14. なぜプリミティブ型はループごとにコレクションスルーできますか?
- 15. 単純な抽象データ型のリンクリストに
- 16. JQueryを使用しない単純な検証が有効でない
- 17. npmとサーバーを使わない単純なReactjsアプリですか?
- 18. ユーザー定義変換演算子は、私は、単純なプリミティブ型のラッパを持っている参照
- 19. エンティティを使用しないでHibernateの単純なJoinTable
- 20. ノードリクエストの単純な使用が動作しない
- 21. 単純なバインディングで複数のViewModelを使用するには
- 22. スパニング可能な文字列を単純なTextviewで使用できないように設定する
- 23. サービス担当者が単純なhtmlファイルをキャッシュできない
- 24. エンティティフレームワークの単純な外部キー
- 25. 誰かがこのジェネリック型のプリミティブ型の使用をJavaで説明することはできますか?
- 26. 単純な型を参照渡ししない理由は?
- 27. テーブルに単純な外部キー制約を追加する
- 28. ハッシュの単純なハッシュに配列キーをハッシュする
- 29. 単純なEventHandler /バリデーショナルテンプレートと関数ポインタを使用するプロバイダ
- 30. Css3を使用した単純なアニメーション
これはどの言語ですか? –
あなたの鍵の種類は何ですか?その構造は何ですか? – Manatherin
自分のタイプのキークラス、または他の誰かのクラスですか?メソッドをオーバーライドする方法を知っていますか? GetHashCodeに関するいくつかの根拠については、http://blogs.msdn.com/b/ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspxを参照してください。 –