私はIntPtrとenumに基づいてメンバーを格納できる場所を確保する必要があります。言い換えれば、IntPtrとenum(sp_playlist_typeという名前)の同じマッチを取得した場合、私は同じ結果を得ることができる必要がありますが、それだけで(それも重要です)。私は2つを含む構造体を作成し、GetHashCode()をオーバーライドすると思ったが、その後、2つの数値の重複を作成しないハッシュアルゴリズムが必要で、同じ結果が毎回生成される2つの数字が存在する。辞書のキーとして2つのフィールドの組み合わせを使用する
答えて
私はタプルのGetHashCodeメソッドと平等がalredy作成されている方法に基づいて、あなたが持っていると思う:
Dictionary<Tuple<IntPtr, YourEnum>, YourResultType>
あなたはもちろんの.NET 4.0で提供されます。
、私はこれは実際には真実ではありません二つの数字
のための複製を作成しないハッシュ・アルゴリズムを必要とするだろう。 GetHashCode()
を上書きする必要がありますが、衝突する可能性があります。ハッシュコード内の衝突を最小限に抑え、排除する必要はありません。
これは実際にはかなり簡単です。一般的なオプションは、構造体の両方のメンバーのハッシュコード、またはそれに類似したものの排他的論理和を使用することです。
Reed、私が間違っている場合は私を修正しますが、私はTuple <>クラスを信じてGetHashCodeをメンバーのハッシュコードの組み合わせに(そして同様に)同様にオーバーライドします。辞書
@James:Tuple
真、本当です。私はタプルやカスタム構造体が好きかどうかを前後に行きます。 –
簡単な方法は、文字列をキーとして使用することです。この文字列で両方の値を結合します。たとえば:
mydic.add(GetKey(ptr, playlist_type), myvalue);
プレイリストはそれが大きなリストではないことを示唆していますが、それはまさにハイパフォーマンスな解決策ではありませんか? –
これは、文字列の変換のためにかなり遅くなります。これは最高のハッシュでもありません。 –
ハッシュコードを作成して正しい配布を保証するのが一般的なパターンです。このようにして、新しい構造体またはクラスを作成してGetHashCodeメソッドをオーバーライドしてキーとして使用する必要はありません。それはすべてのフレームワークのバージョンで有効です。 – Borja
それは他の人がそれを一意にするための要件がない言及しているので、GetHashCodeメソッドをオーバーライドすることは厳密には必要ありません。
private string GetKey(IntPrt prt, sp_playlist_type playlist_type)
{
return string.format("{0}#{1}", prt, type)
}
がそれを使用するには、のようなものを使用します。
パフォーマンス上の理由から、構造体のEqualsをオーバーライドすることが望ましい場合があります。as described in MSDN
この場合はrecommended to override GetHashCodeです。この場合、おそらくIntPtrと列挙型(64ビットシステム上のIntPtrのLS 32ビット)のXORです。
Equalsをオーバーライドする場合、GetHashCodeをオーバーライドする必要があります。 – Pedro
もしそれが強く推奨されているということを意味するのであれば、私は同意します - それは私が作ろうとしていることです。しかし、フレームワークはあなたに義務付けておらず、構造体のデフォルトと同等のEquals実装を作成すると、そうすることなく取り除くことができます。 – Joe
あなたがそれをやっていなければ、あなたは辞書に適切なアクセスを保証することはできません。 (つまり、あなたのコードには深刻な欠陥があります)。同等の実装を作成することについては、その場合、あなたは本当にEqualsを上書きしていないと言います。 – Pedro
- 1. 2つの辞書からのキーと値のペアの組み合わせ
- 2. 複数の辞書をキーと値で組み合わせる?
- 3. Julia - 辞書のキーの組み合わせを繰り返す
- 4. 第1の辞書キーと第2の辞書値とを組み合わせる
- 5. 2つのリストを組み合わせて辞書を作成する
- 6. 同様のキーを持つ辞書の文字列を組み合わせる
- 7. 辞書として値を持つ2つの辞書(第2レベルの辞書)を組み合わせる方法
- 8. Odoo - 2つのフィールドを1つに組み合わせる
- 9. 3つのフィールドを日付として組み合わせる -
- 10. 2つのフィールドの組み合わせで関連するテーブル
- 11. 2つのフィールドを組み合わせて
- 12. 2つの列をユニークなキーとして組み合わせる方法は?
- 13. jQuery for passwordフィールドに2つのバリデーションを組み合わせる
- 14. Djangoは2つのフィールドにフィルタを組み合わせます
- 15. geom_pointとgeom_lineをggplot2のggplot2と組み合わせて2つのグループ化要因を組み合わせる
- 16. 2つのMod書き換えルールを組み合わせる
- 17. 2つのリストの組み合わせ
- 18. 2つのディレクティブをまとめて組み合わせる
- 19. 2つのJavascriptをまとめて組み合わせる
- 20. 2つのドロップダウンリストの値を組み合わせて、JavaScriptを使用して非表示フィールドに値を渡す
- 21. 2つのタブスクリプトを組み合わせて1つにする
- 22. SignalRとWebAPIの2つの組み合わせを使用する理由は?
- 23. MySQLからJSON - 2つのクエリ/書式の組み合わせ
- 24. 別の辞書(Python)のすべての組み合わせから辞書を作成してください
- 25. 。セットセマンティクスと辞書セマンティクスを組み合わせたネットデータ構造
- 26. 2つのクエリを組み合わせてHAVINGを使用する
- 27. 配列と組み合わせパターンの組み合わせを見つける
- 28. 2つの.csvファイルを組み合わせてPythonで辞書を作成する
- 29. vb.netのキーの組み合わせ
- 30. VB.NETでのキーの組み合わせ
標準の間違いです。ハッシュは同じ番号を再現する必要があります。ユニークである必要はありません。 Equals()はアイデンティティーを処理します。 –
@ハンス: 'Equals'は' Dictionary 'から呼び出されますか? –
Alxandr
すでに述べたように、ハッシュコードは一意である必要はありません。ただし、等しい2つのオブジェクトは、互いに同じハッシュコードを持つ必要があります。 – Pedro