0

我有转换表需要包含在内存中以便快速访问。到目前为止,我使用了一个简单Hashtable的键是内部代码,而值是一个包含外部代码和其他元数据的对象。

现在我们需要进行反向查找,即根据外部代码获取内部代码。我只能提出以下选项:

  1. 有另一个容器用于此查找,Hashtable 仅包含内部代码作为值,以防止更多冗余。
  2. 使用我现在使用的同一个容器,现在使用外部代码作为 Key 再次存储这些对象(具有防止冲突的前缀)。
  3. 不要使用 Keys 提取数据,而是遍历同一容器下包含的 Values 以找到请求的对象( O(n), same memory usage )。

容器正在延迟加载,因此选项 1 和 2 通常不会在最坏的情况下执行。

有人想吗?请告诉我有一些我可以使用的高效容器,我错过了!

* 编辑 *

作为一个 GC'd 框架,并接受我必须有两个转换数组(字典)的事实,以下代码行实际上是否意味着我在内存上只存储了一个对象,然后在两个不同的情况下为它存储了两个指针散列单元格?

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);
}

伊塔马尔。

4

2 回答 2

1

构建一个自定义集合类,其中包含两个内部哈希表(字典),每个方向一个。

  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

我宁愿使用两个实例Dictionary<TKey, TValue>

它有利于代码的可读性

你确定这本字典是性能瓶颈吗?

于 2009-11-30T18:42:00.337 回答