5

クラスの 1 つでルックアップ テーブルをインスタンス メンバーとして格納する必要があります。オブジェクトが構築されると、テーブルが初期化されます。各「行」には 3 つの「列」があります。

StringKey (e.g., "car")
EnumKey (e.g., LookupKeys.Car)
Value (e.g, "Ths is a car.")

StringKeyまたはEnumKey のいずれかによるルックアップで最高のパフォーマンスが得られるデータ構造を選択したいと考えています。

同じ辞書の値に対して 2 つのキーがあるのはちょっと厄介です。私はこれまでにこれに遭遇したことがないので、この種の標準は何なのか疑問に思っています.

Key/Key/Value の代わりに Key/Value/Value 構造を作成することもできますが、パフォーマンスにどのような影響があるのか​​疑問に思っています。

私はこれについてすべて間違って考えていますか?

4

5 に答える 5

5

うーん...「間違っている」というのは厳しい言い方です。最も一般的なディクショナリは「値への単一のキー」であり、そのための効率的なデータ構造 (マップ) を提供するために多くの労力が費やされているため、値のメモリを共有して値のメモリを共有するのが最善の場合が多いと思います。可能な限り。

于 2009-03-13T15:26:02.623 に答える
4

2 つのハッシュマップがあります。

  • StringKey から value までの 1 つ。

  • EnumKey から値までの 1 つ。

すべての Value インスタンスを複製する必要はありません。これらのオブジェクトは 2 つのハッシュマップ間で共有できます。

アイテム数が多い場合は、2 つのハッシュマップではなく 2 つのツリーマップを使用することをお勧めします。しかし、本質的な原則 (「価値を共有する」) は両方の構造に適用されます。2 つのマップを持つ値の 1 つのセット。

于 2009-03-13T15:31:55.463 に答える
1

両方のタイプのキーで同じ構造にキーを入れる必要は本当にありますか? おそらく、複雑なデータ構造を自分で再構築する必要はありません。メモリが問題にならない場合は、実際に 2 つのルックアップ テーブルが存在するように、ルックアップ テーブルに対してある種のカプセル化を行うことができます。このカプセル化構造を使用して、どちらのタイプのキーでも「同じ」構造から値を引き出すことができることをシミュレートできます。

また

列挙値と文字列キーをマッピングする方法があれば、1 種類のルックアップ テーブルだけでそのルートに進むことができます。

于 2009-03-13T15:36:34.907 に答える
0

LINQのILookup(TKey、TElement)インターフェイスが役立つ場合があります。辞書が次のようなものであると仮定します。

Dictionary<carKey, carValue> cars;

あなたが使用することができます:

ILookUp<carValue, carKey> lookup = cars.ToLookup(x => x.Value, x => x.Key);

(...実際、私は質問を少し読み間違えたかもしれませんが、ILookUpはまだ法案に適合しているかもしれませんが、キー/値セットはキーと列挙型である必要があるかもしれません。)

于 2009-03-13T16:11:19.067 に答える
-1

すべての値が両方のタイプのキーからアクセスできることが保証されている場合、別のアイデアは、あるタイプのキーを別のタイプに変換することです。例えば:

public Value getValue(String key)
{
    dictionary.get(key); // normal way
}

public Value getValue(Enum enumKey)
{
    String realKey = toKey(enumKey);
    getValue(realKey); // use String key
}

Enum に String キーを返す toKey() メソッドを実装させるか、または Enum 値を対応する String にマップする別の辞書を持たせることができます。

于 2009-03-13T16:51:25.523 に答える