我正在使用下面的代码来增加或插入字典中的值.如果我正在递增的键不存在,我想将其值设置为1.
public void IncrementCount(Dictionary<int, int> someDictionary, int id)
{
int currentCount;
if (someDictionary.TryGetValue(id, out currentCount))
{
someDictionary[id] = currentCount + 1;
}
else
{
someDictionary[id] = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一种合适的方式吗?
Kin*_*tor 81
事实证明使用ConcurrentDictionary是有意义的,它具有方便的upsert方法:AddOrUpdate.
所以,我刚刚用过:
someDictionary.AddOrUpdate(id, 1, (id, count) => count + 1);
Run Code Online (Sandbox Code Playgroud)
Ani*_*Ani 65
你的代码很好.但这是一种简化方式,不需要在代码中进行分支:
int currentCount;
// currentCount will be zero if the key id doesn't exist..
someDictionary.TryGetValue(id, out currentCount);
someDictionary[id] = currentCount + 1;
Run Code Online (Sandbox Code Playgroud)
这取决于如果密钥不存在,则该TryGetValue方法设置value为其类型的默认值.在你的情况下,默认值int是0,这是你想要什么.
UPD.从C#7.0开始,可以使用out variables以下命令缩短此代码段:
// declare variable right where it's passed
someDictionary.TryGetValue(id, out var currentCount);
someDictionary[id] = currentCount + 1;
Run Code Online (Sandbox Code Playgroud)
yel*_*ood 15
这是一个很好的扩展方法:
public static void Increment<T>(this Dictionary<T, int> dictionary, T key)
{
int count;
dictionary.TryGetValue(key, out count);
dictionary[key] = count + 1;
}
Run Code Online (Sandbox Code Playgroud)
用法:
var dictionary = new Dictionary<string, int>();
dictionary.Increment("hello");
dictionary.Increment("hello");
dictionary.Increment("world");
Assert.AreEqual(2, dictionary["hello"]);
Assert.AreEqual(1, dictionary["world"]);
Run Code Online (Sandbox Code Playgroud)
dri*_*iis 14
它是可读的,意图很明确.我觉得这很好.无需发明更智能或更短的代码; 如果它没有像你的初始版本那样保持意图:-)
话虽这么说,这是一个稍短的版本:
public void IncrementCount(Dictionary<int, int> someDictionary, int id)
{
if (!someDictionary.ContainsKey(id))
someDictionary[id] = 0;
someDictionary[id]++;
}
Run Code Online (Sandbox Code Playgroud)
如果您可以同时访问字典,请记住同步对它的访问.
只需在.NET 4上对整数键进行一些测量.
这不是你的问题的答案,但为了完整起见,我已经测量了各种类的行为,这些类对于基于整数键递增整数很有用:简单Array,Dictionary(@ Ani的方法),Dictionary(简单方法),SortedDictionary(@ Ani的方法) )和ConcurrentDictionary.TryAddOrUpdate.
这是结果,调整2.5 ns用于包装类而不是直接使用:
Array 2.5 ns/inc
Dictionary (@Ani) 27.5 ns/inc
Dictionary (Simple) 37.4 ns/inc
SortedDictionary 192.5 ns/inc
ConcurrentDictionary 79.7 ns/inc
Run Code Online (Sandbox Code Playgroud)
这就是代码.
需要注意的是ConcurrentDictionary.TryAddOrUpdate比慢三倍Dictionary的TryGetValue + indexer的setter.而后者比Array慢十倍.
如果我知道键的范围很小,那么我会使用数组,否则就会使用组合方法.