我正在使用字典来累积键的出现次数,因此,核心操作是编写一个键值对,其中的值是前一个值加 1,如果没有前一个值,则只加 1。但是,这需要两个单独的字典操作(读取和写入),而我只能执行一个操作 (AddOrUpdate
)。
我注意到并发字典支持 AddOrUpdate
但普通的通用 Dictionary
似乎不支持。
因此,对可变整数的引用字典更快。但是,这引入了不必要的引用,这意味着堆分配和写入障碍。所以我猜有可能做得更好,但如果不从头开始重写 Dictionary
,我看不出怎么做。我说得对吗?
最佳答案
你可以这样做:
private class Counter
{
public string Key { get ; set ; }
public int Frequency { get ; set ; }
}
...
Dictionary<string,Counter> frequencyTable = new Dictionary<string,Counter>() ;
...
string someKey = GetKeyToLookup() ;
Counter item = null ;
bool hit = frequencyTable.TryGetValue( someKey,out item ) ;
if ( !hit )
{
item = new Counter{ Key=someKey,Frequency=0 } ;
}
++ item.Frequency ;
如果这还不够好,为什么要自己写?使用高性能C5 Collections Library .它是免费的(事实上,最初由微软资助),建立在微软的 System.Collections.Generic
接口(interface)之上,其字典、集合和包支持 FindOrAdd()
语义。
- Nuget:http://www.nuget.org/packages/C5/
- 项目主页:http://www.itu.dk/research/c5/
- 文档是 ITU-TR-2006-76 — The C5 Generic Collection Library for C# and CLI: Version 1.1.0 of 2008-02-10 .它有点过时,因为它反射(reflect)的是 v1.1.1 而不是当前版本(2013 年 8 月 27 日的 v2.2)。不过,基本情况没有改变。
关于c# - 高效地更新 .NET 字典中的绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18471076/