是否可以在 C# 中获取对字典项的引用

本文关键字:字典 引用 获取 是否 | 更新日期: 2023-09-27 18:36:39

我正在一个被调用数亿次的函数上实现一个缓存。缓存大小为数千万个项目。它目前使用Dictionary实现,其中的查找需要大量的时间。

是否可以在Dictionary中获取对整个对的引用,而不仅仅是值,因此我可以检查值是否存在,检查它(并可能更新它)是否使用单个查找?

目前,我有这样的东西:

int val;
if (cache.TryGetValue(key, out val))
    if (val < newVal) cache[key] = newVal;
    else return val;
else
    cache.Add(key, newVal);

我想得到这个:

Pair pair = cache.GetPair(key);
if (pair != null)
    if (pair.Value < newVal) pair.Value = newVal;
    else return pair.Value;
else
    cache.Add(key, newVal);

如果有允许这样做的替代数据结构,我也很高兴听到它。

提前感谢!

是否可以在 C# 中获取对字典项的引用

这是受到无限极母马的回答的启发。假设您的cache变量现在是一个Dictionary<string, int>您可以将其更改为Dictionary<string, MutableInt32>,其中MutableInt32是这样编写的:

// wraps an int that may change
class MutableInt32
{
  public int Value;
}

然后,您可以将代码更改为

MutableInt32 val;
if (cache.TryGetValue(key, out val))
  if (val.Value < newVal) val.Value = newVal;
  else ...

你的想法很好,因为它把字典中哈希和查找桶操作的数量减少一半。我自己对这类东西进行了基准测试,字典并不像人们想象的那么快。

不幸的是,内置字典不支持此功能。甚至没有解决方法。

您可以实现自己的哈希表并自己执行此操作。撇开法律问题不谈,你可以从字典的实现开始,并添加一个GetAndUpdateOrCreate方法。

您当然可以将配对存储在字典中!

public class KeyValueTuple
{
    private string key;
    private int value;
    public KeyValueTuple(string key, int value)
    { 
        this.key = key;
        this.value = value;
    }
}
public class BigDataCache
{
    private Dictionary<string, KeyValueTuple> cache;
    public BigDataCache()
    {
        cache = new Dictionary<string, KeyValueTuple>();
        cache.Add("entry1", new KeyValueTuple("entry1", 1));
        cache.Add("entry2", new KeyValueTuple("entry2", 2));
        cache.Add("entry3", new KeyValueTuple("entry3", 3));
    }
    public KeyValueTuple GetTuple(string key)
    {
        KeyValueTuple value = null;
        if (cache.TryGetValue(key, out value))
        {
            return value;
        }
        return null;
    }
}
public void SomeMethod()
{
    BigDataCache d = new BigDataCache();
    var value1 = d.GetTuple("entry1");
    var value2 = d.GetTuple("entryNotValid");
}