我经常发现自己在创造一个Dictionary http://msdn.microsoft.com/en-us/library/xfhwa508.aspx具有不平凡的价值类别(例如List http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx),然后在填写数据时始终编写相同的代码模式。
例如:
var dict = new Dictionary<string, List<string>>();
string key = "foo";
string aValueForKey = "bar";
也就是说,我想插入"bar"
进入到key对应的列表中"foo"
,其中关键"foo"
可能不会映射到任何东西。
这就是我使用不断重复模式的地方:
List<string> keyValues;
if (!dict.TryGetValue(key, out keyValues))
dict.Add(key, keyValues = new List<string>());
keyValues.Add(aValueForKey);
有没有更优雅的方法来做到这一点?
没有此问题答案的相关问题:
- 是否有一个 IDictionary 实现在缺少键时返回 null 而不是抛出? https://stackoverflow.com/q/538729/974531
- 在 C# 字典中仅进行一次查找即可查找或插入 https://stackoverflow.com/q/6408916/974531
- 如果键不存在,字典返回默认值 https://stackoverflow.com/q/2601477/974531
我们对此的看法略有不同,但效果相似:
public static TValue GetOrCreate<TKey, TValue>(this IDictionary<TKey, TValue> dict, TKey key)
where TValue : new()
{
if (!dict.TryGetValue(key, out TValue val))
{
val = new TValue();
dict.Add(key, val);
}
return val;
}
Called:
var dictionary = new Dictionary<string, List<int>>();
List<int> numbers = dictionary.GetOrCreate("key");
它使用公共无参数构造函数的通用约束:where TValue : new()
.
为了帮助发现,除非扩展方法非常特定于某个狭窄的问题,否则我们倾向于将扩展方法放置在它们所扩展的类型的命名空间中,在本例中:
namespace System.Collections.Generic
大多数时候,使用该类型的人有using
声明在顶部定义,因此 IntelliSense 还会找到代码中定义的扩展方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)