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

C# 仅使用每个键从具有多个键的字典中检索值,c#,.net,performance,dictionary,collections,C#,.net,Performance,Dictionary,Collections,在这种情况下,我使用字典来存储实体。每个实体都有两个ID,在检索值时,我希望以此作为索引。一个是在创建对象时生成的(我将调用此ID),另一个是从外部源读取的(我将调用此句柄)。我和ToLookup()玩过,这非常非常慢。我已经创建了一个自定义键对象来包含这两个标识符,但似乎字典的基本用法意味着您必须了解这两个标识符才能检索关联的值。如果我只知道其中一个,我需要一个非常快速的解决方案。任何帮助都将不胜感激。我还尝试创建一个内部包含两个字典的类,但是我猜指针引用会增加内存占用,所以我也不确定这是正确

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

如果只提供两种可能类型的键中的一种,那么要高效地查找值,唯一的方法就是使用两个字典,这就需要两倍于单个查找的内存(大约)。这是不可能的

如果不能使用那么多内存,那么你必须求助于效率低得多的搜索算法,比如线性搜索


您可以选择执行速度或内存。你得选一个。

好吧,我想我已经想出了我认为我能想到的最好的折衷办法。我最终使用了主字典和内部子字典作为查找。子字典存储ID并由句柄编制索引。然后,我可以为句柄创建一个自定义索引器,使用查找字典查找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);
    }
}
公共类多键字典:字典
{
私人词典_handleLookup=新词典();
公共词典手册
{
获取{return\u handleLookup;}
设置{u handleLookup=value;}
}
公共字符串此[字符串句柄]
{
得到
{
EntityID=this.HandleLookup[handle];
返回基[id];
}
}
公共void添加(EntityID、字符串句柄、字符串值)
{
添加(id、值);
this.HandleLookup.Add(handle,id);
}
}

我希望这不是一个选择一个的问题,而是希望有人有一个很好的技巧,可以平衡执行速度和内存。