我正在使用字典来累积键的出现次数,因此,核心操作是编写一个键-值对,其中值是前一个值加上一个或一个(如果没有前一个值)。但是,当我可能只需要执行一个操作(AddOrUpdate
)时,这需要两个单独的字典操作(读和写)。
我注意到并发字典支持AddOrUpdate
,但普通的通用Dictionary
似乎没有。
因此,对可变int的引用字典更快。但是,这引入了不必要的引用,这意味着堆分配和写入障碍。因此,我猜测可能会做得更好,但是如果不从头开始重写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。它是免费的(实际上最初是由Microsoft资助的),它建立在Microsoft的
System.Collections.Generic
接口(interface)上,并且其字典,集合和包支持FindOrAdd()
语义。