You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效处理Dictionary<ContainerControl, int>的键检查与值更新?

优化Dictionary<ContainerControl, int>的键检查与值更新

最优实现:使用TryGetValue方法

Dictionary<TKey, TValue>提供的TryGetValue方法是解决这类"检查键是否存在并获取值"场景的最优方案,它仅需一次哈希查找就能完成键存在性验证和值获取,相比原实现大幅减少不必要的查找开销:

var dict = new Dictionary<ContainerControl, int>();
var c = GetControl();

if (dict.TryGetValue(c, out int currentValue))
{
    dict[c] = currentValue + 1;
}
else
{
    dict.Add(c, 0);
}

这里TryGetValue只做一次哈希查找,后续赋值操作虽会再执行一次查找,但整体比原实现的三次查找减少了一次,是当前最简洁高效的常规实现方式。

原实现的性能问题

你对原实现的分析完全正确:

  • ContainsKey(c):第一次哈希查找
  • dict[c]取值:第二次哈希查找
  • dict[c] = ...赋值:第三次哈希查找
    三次重复的哈希查找会带来不必要的性能损耗,高频调用场景下尤为明显。

关于你设想的GetKeyValuePair思路

即使Dictionary提供这类方法,也无法实现你想要的直接更新值的效果:因为KeyValuePair<TKey, TValue>是值类型,获取到的是字典元素的拷贝,修改kvp.Value只会改变拷贝的值,不会影响字典内的原始数据,最终仍需通过索引器赋值,无法减少查找次数。

LINQ方式的性能表现

用SingleOrDefault(x => x.Key == c)的方式性能极差,绝对不推荐:
LINQ的SingleOrDefault会遍历字典中所有键值对(直到找到匹配项),时间复杂度为O(n);而字典的哈希查找是O(1)级别的。当字典元素数量较多时,这种方式的性能会急剧下降,完全没有利用字典的哈希表特性。

内容的提问来源于stack exchange,提问作者Disti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:33:49