2009-11-30 37 views
0

我有我需要包含在内存中的快速访问转换表。到目前为止,我使用了一个简单的Hashtable Key是内部代码,Value是一个持有外部代码和其他元数据的对象。用于双向转换数据的.NET容器?

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

  1. 有另一个容器用于此查找,哈希表只包含内部代码作为值以防止更多的冗余。
  2. 使用我现在使用的同一个容器,并使用外部代码作为密钥(具有防止冲突的前缀)再次存储这些对象。
  3. 不要使用Keys获取数据,而是遍历包含在同一容器下的值以查找请求的对象(O(n),相同的内存使用情况)。

该容器正在延迟加载,所以选项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); 
} 

Itamar。

+0

为什么你就不能懒加载反向查找散? – Ken 2009-11-30 18:39:32

+0

我是,即使在一个项目的基础上(而不是一次列表)。这是我的出发点 - 试图在性能和内存使用方面找到最佳选择。 – synhershko 2009-11-30 18:54:46

回答

1

构建一个具有两个内部哈希表(Dictionarys)的自定义集合类,每个方向一个。

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都属于同一类型,则需要再不同配方...

+0

问题中解释的唯一问题是V不是本机类型。我不想将它用作关键...此外,这实际上是最糟糕的情况的实现 - 2个Hashtables作为一个整体存储两次 - 正是我想要避免的... – synhershko 2009-11-30 18:57:32

+0

@synhershko,Why你想避免这种情况吗?记住,你所存储的所有内容都是一个参考变量,一个指针。您不存储两次对象。我看不出有两次存储的东西。如果你不这样做,你就会陷入对单个集合的迭代中找到给定值的关键。而且你并没有存储或者“实际使用”这个对象作为关键字,记住,你实际上是使用从这个对象创建的hash作为关键字。 – 2009-11-30 21:41:03

+0

是的,我想这样 - 看我的编辑。我在问是否有办法解决两个哈希表 - 显然答案是否定的。关于计算非本机类型的哈希值,我知道它是用作密钥的计算哈希值。然而,我的直觉告诉我,当对象变大时(例如在其中有另一个数组/哈希表),它不会是理想的 - 只是计算哈希将是一项昂贵的任务,至少比实时系统要贵。 – synhershko 2009-12-01 11:50:44

0

我宁愿用的Dictionary<TKey, TValue>

两个实例,这有利于代码的可读性

你肯定这本字典是一个性能瓶颈?