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

本文关键字:字典 检索 | 更新日期: 2023-09-27 18:10:16

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

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

在给定两种可能的键类型之一的情况下,能够有效查找值的唯一方法是拥有两个字典,而这本质上需要的内存(大约)是单个查找的两倍。这是没有办法的。

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

选择是你的,执行速度或内存。

嗯,我想我已经想出了我能想到的最好的折衷办法。我最终使用了主字典和一个内部子字典作为查找。子字典存储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);
    }
}