.Net中的某些集合类型具有可选的"初始容量"构造函数参数.例如:
Dictionary<string, string> something = new Dictionary<string,string>(20);
List<string> anything = new List<string>(50);
Run Code Online (Sandbox Code Playgroud)
我似乎无法找到MSDN上这些对象的默认初始容量.
如果我知道我只会在字典中存储12个左右的项目,那么将初始容量设置为20就没有意义吗?
我的理由是,假设容量增长的速度与StringBuilder一样,每次容量达到时都会增加一倍,并且每次重新分配都很昂贵,为什么不预先设置你知道会保存数据的大小,还有一些额外的房间以防万一?如果初始容量是100,并且我知道我只需要十几个,那么好像其余的内存都没有分配.
我需要向Set添加很多对象.我应该非常快速地检索它们.我知道的唯一方法是使用哈希.但是C#中的HashSet类不包含任何"Get"方法.字典类没有用,因为在字典中查找对象非常耗时.
我们的应用程序使用了大量字典,这些字典具有不经常更改的多级查找.我们正在研究转换使用字典进行大量查找的一些关键代码,以使用替代结构 - 更快的查找,点亮内存/ gc.这让我们比较了各种可用的词典/库 -
Dictionary(System.Collections.Generics.Dictionary-SCGD) ,ImmutableDictionary,.C5.HashDictionaryFSharpMap
运行包含各种项目的以下程序 - 100,1000,10000,100000 - 表示词典在大多数范围内仍然是赢家.第一行表示集合中的项目.MS/Ticks将随机执行x查找所花费的时间(代码如下).
项目 - 100
SCGD - 0 MS - 50 Ticks
C5 - 1 MS - 1767 Ticks
Imm - 4 MS - 5951 Ticks
FS - 0 MS - 240 Ticks
项目 - 1000
SCGD - 0 MS - 230 Ticks
C5 - 0 MS - 496 Ticks
Imm - 0 MS - 1046 Ticks
FS - 1 MS - 1870 …
有没有办法从Dictionary(通过Key)中删除条目并Value在"同一步骤"中检索它?
例如,我正在打电话
Dictionary.Remove(Key);
Run Code Online (Sandbox Code Playgroud)
但我也希望同时返回Value.该函数只返回一个bool.
我知道我可以做点什么
Value = Dictionary[Key];
Dictionary.Remove(Key);
Run Code Online (Sandbox Code Playgroud)
但似乎这会搜索字典两次(一次获取值,另一次将其从字典中删除).我怎么能(如果可能的话)两次搜索字典?