仅使用每个键从具有多个键的字典中检索值

时间:2014-06-24 15:33:42

标签: c# .net performance dictionary collections

我有这种情况,我使用字典来存储实体。每个实体都有两个我想要在检索值时索引的ID。一个是在创建对象时生成的(我将调用此ID),另一个是从外部源读取的(我将称之为Handle)。我玩过ToLookup(),这非常非常慢。我已经创建了一个自定义键对象来包含两个标识符,但似乎基本上使用字典意味着你必须知道两者来检索相关的值。如果我只知道一个或另一个,我需要一个非常快速的解决方案。任何帮助,将不胜感激。我也尝试创建一个内部包含两个字典的类,但是我猜测指针引用会增加内存占用,所以我不确定这是正确的方法。我有点担心内存占用的原因之一是因为我将其编译为dll,以便可以将其加载到第三方系统中。我无法控制要使用的内存量,因此使用的越多,我就越少。如果这个不够清楚,我可以提供一些过于简单的例子。请告诉我要提供哪些内容。

2 个答案:

答案 0 :(得分:0)

只有两种可能类型的密钥中的一种才能有效地查找值的唯一方法是拥有两个字典,这本身就需要两倍的内存(大约)单个查找。没有真正的方法。

如果使用那么多内存不是一个选项,那么你必须采用效率低得多的搜索算法,例如线性搜索。

选择是你的,执行速度还是记忆。你必须选择一个。

答案 1 :(得分:0)

嗯,我想我已经想出了最好的妥协,我想我可以考虑一下。我最终使用主字典和内部子字典作为查找。子字典存储ID并由Handle索引。然后我可以为Handle创建一个自定义索引器,使用查找字典查找ID,然后调用基本索引器来检索实际值。这使得它比复制词典重量轻一些。如果其他人有兴趣(或者有其他评论要么改进或向我展示更好的方向),这里有一个非常简单的例子:

public class MultiKeyDictionary : Dictionary<EntityID, string>
{
    private Dictionary<string, EntityID> _handleLookup = new Dictionary<string, EntityID>();
    public Dictionary<string, EntityID> HandleLookup
    {
        get { return _handleLookup; }
        set { _handleLookup = value; }
    }

    public string this[string handle]
    {
        get
        {
            EntityID id = this.HandleLookup[handle];
            return base[id];
        }
    }

    public void Add(EntityID id, string handle, string value)
    {
        base.Add(id, value);
        this.HandleLookup.Add(handle, id);
    }
}