我正在使用字典来累积键的出现次数,因此,核心操作是编写一个键-值对,其中值是前一个值加上一个或一个(如果没有前一个值)。但是,当我可能只需要执行一个操作(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()语义。
  • 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)。不过,基本内容没有改变。
  • 10-04 13:57