我经常发现自己创建了Dictionary一个非平凡的值类(例如List),然后在填充数据时总是编写相同的代码模式.
例如:
var dict = new Dictionary<string, List<string>>();
string key = "foo";
string aValueForKey = "bar";
Run Code Online (Sandbox Code Playgroud)
也就是说,我想插入"bar"与key对应的列表"foo",其中key "foo"可能不会映射到任何内容.
这是我使用不断重复的模式的地方:
List<string> keyValues;
if (!dict.TryGetValue(key, out keyValues))
dict.Add(key, keyValues = new List<string>());
keyValues.Add(aValueForKey);
Run Code Online (Sandbox Code Playgroud)
有更优雅的方式吗?
相关问题没有这个问题的答案:
我知道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) 我厌倦了这个字典成语:
Dictionary<Guid,Contact> Contacts;
//...
if (!Contacts.ContainsKey(id))
{
contact = new Contact();
Contacts[id] = contact;
}
else
{
contact = Contacts[id];
}
Run Code Online (Sandbox Code Playgroud)
如果有一种语法允许从默认构造函数隐式创建新值,如果它不存在(字典知道值的类型,毕竟),那将是很好的.有人看过这样做的助手(例如扩展方法)吗?