包含C#列表的默认字典

时间:2017-11-02 17:41:04

标签: c# dictionary

有没有办法让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};
}

3 个答案:

答案 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 );

我相信它更容易阅读