相关疑难解决方法(0)

如何通过单键查找优化 C# 字典的更新?

比如说我有:

Dictionary<string, double> foo;
Run Code Online (Sandbox Code Playgroud)

我可以:

foo["hello"] = foo["hello"] + 2.0
Run Code Online (Sandbox Code Playgroud)

或者我可以这样做:

foo["hello"] += 2.0
Run Code Online (Sandbox Code Playgroud)

...但是编译器只是将其扩展为上面的代码。我通过使用 JetBrains .Peek 查看程序集来验证这一点。

这似乎很浪费,因为需要进行两次关键查找才能更新。是否有一种字典实现可以在一次查找中完成此操作?请注意,我使用字典来存储来自网格的 100k 项几何信息,并且查找位于内部循环中。请不要给出“过早优化是万恶之源”的答案。:)

是的,我已经简介了。

截屏

c# optimization performance dictionary

6
推荐指数
1
解决办法
146
查看次数

可以将元素添加到 .NET 字典中,跳过内部 ContainsKey() 调用

我知道Dictionary<K,V>.TryAdd().NET Core 2.0 中添加的方法通过在添加元素之前仅检查一次字典是否包含键来提高性能,这与以下方法不同:

if(!dico.ContainsKey(key)) { dico.Add(key,val); } // .Add() calls ContainsKey() a second time
Run Code Online (Sandbox Code Playgroud)

但是出于性能原因,我只想val在以下情况下才进行延迟构建!dico.ContainsKey(key)

if(!dico.ContainsKey(key)) { dico.Add(key, new Value()); }
Run Code Online (Sandbox Code Playgroud)

在这种情况下TryAdd(),由于该值不是延迟构建的,因此会降低性能。

dico.TryAdd(key,new Value());
Run Code Online (Sandbox Code Playgroud)

有没有办法既进行一次ContainsKey()调用延迟构建值?就像是AddWithNoContainsKeyCheck()

if(!dico.ContainsKey(key)) { dico.AddWithNoContainsKeyCheck(key, new Value()); }
Run Code Online (Sandbox Code Playgroud)

.net c# dictionary base-class-library

6
推荐指数
1
解决办法
132
查看次数