0

高速アクセスのためにメモリに含める必要のある変換テーブルがあります。これまで私は単純なものを使用してHashtableいました。キーは内部コードであり、値は外部コードやその他のメタデータを保持するオブジェクトでした。

次に、逆ルックアップを行う必要があります。つまり、外部コードに基づいて内部コードを取得する必要があります。私は次のオプションしか思いつかなかった:

  1. このルックアップ用に別のコンテナを用意します。冗長性を防ぐために、値として内部コードのみを含むハッシュテーブルを用意します。
  2. 現在使用しているのと同じコンテナを使用し、外部コードをキーとして使用してこれらのオブジェクトを再度保存します(衝突を防ぐためにプレフィックスを付けます)。
  3. キーを使用してデータをプルするのではなく、同じコンテナーに含まれる値を反復処理して、要求されたオブジェクト(O(n)、同じメモリ使用量)を見つけます。

コンテナは遅延読み込みされているため、オプション1と2は通常、最悪のシナリオでは実行されません。

誰か考えますか?そのために使用できる効率的なコンテナがあることを教えてください。

* 編集 *

GCのフレームワークであり、2つの変換配列(ディクショナリ)が必要であるという事実を受け入れると、次のコード行は、実際には1つのオブジェクトのみをメモリに格納し、次に2つの異なるポインタの下にそのオブジェクトへの2つのポインタを格納することを意味します。ハッシュ化されたセル?

Dictionary<K1,V> forward;
Dictionary<K2,V> reverse;
//...    
void Add(V myObject)
{
    // myObject being the BLL object
    forward.Add(myObject.InternalCode, myObject);
    reverse.Add(myObject.ExternalCode, myObject);
}

Itamar。

4

2 に答える 2

1

各方向に 1 つずつ、2 つの内部ハッシュ テーブル (辞書) を持つカスタム コレクション クラスを構築します。

  public BiHashTable<K, V>
  {
     private Dictionary<K, V> vals = new Dictionary<K, V>();
     private Dictionary<V, K> keys = new Dictionary<V, K>();
     public void Add(K key, V val)
     {
        vals.Add(key, val);
        keys.Add(val, key);
     }
     public K this[v val] { get { return keys[val]; } }
     public V this[K key] { get { return vals[key]; } }
     // etc... 
  }

注: K と V の両方が同じ型である場合、これは問題になります。その場合、別の定式化が必要です...

于 2009-11-30T18:44:42.413 に答える
0

私はむしろ2つのインスタンスを使用しますDictionary<TKey, TValue>

コードの可読性を優先します

この辞書がパフォーマンスのボトルネックであると確信していますか?

于 2009-11-30T18:42:00.337 に答える