是否可以在 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);
如果有允许这样做的替代数据结构,我也很高兴听到它。
提前感谢!
这是受到无限极母马的回答的启发。假设您的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");
}