有没有办法让C#中的Dictionary
自动拥有一个与任何键相关联的空列表,而不是自己创建这样的类?如果可能,我想避免使用以下代码:
int x = 0;
int y = 42;
Dictionary<int, List<int>> dict = new Dictionary<int, List<int>>();
List<int> newList;
if (dict.containsKey(x))
{
dict[x].Add(y);
}
else
{
dict[x] = new List<int>{y};
}
或可能:
int x = 0;
int y = 42;
Dictionary<int, List<int>> dict = new Dictionary<int, List<int>>();
List<int> newList;
if (dict.TryGetValue(x, out newList))
{
newList.Add(y);
}
else
{
dict[x] = new List<int>{y};
}
答案 0 :(得分:1)
使用扩展方法可以很好地抽象出这种行为。
public static TValue GetOrAdd<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, Func<TKey, TValue> valueFactory)
{
if (dictionary == null) throw new ArgumentNullException(nameof(dictionary));
if (valueFactory == null) throw new ArgumentNullException(nameof(valueFactory));
TValue value;
if (!dictionary.TryGetValue(key, out value))
{
value = valueFactory.Invoke(key);
dictionary.Add(key, value);
}
return value;
}
方法签名与ConcurrentDictionary.GetOrAdd()
相同。
var list = dict.GetOrAdd(x, (_) => new List<int>());
list.Add(y);
答案 1 :(得分:0)
你已经有了答案,字典没有这样的能力,使用扩展方法只是伪造它并隐藏你正在查找字典两次的事实(如果密钥不存在)。但如果让你开心,你会写一行代码。
在c#7中,你怎么能更多地收拾东西。
if (dict.TryGetValue(x, out var list)) list.Add(y);
else dict.Add(x, new List<int>{y});
如果密钥已存在,则会有一个查找;如果密钥不存在,则会有两个查找。
答案 2 :(得分:-1)
通常我的代码是:
var $container = $( "#container" );
$container.append( html );
我相信它更容易阅读