.NET 字典:获取现有值或创建并添加新值

2024-04-26

我经常发现自己在创造一个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(使用前将#替换为@)

.NET 字典:获取现有值或创建并添加新值 的相关文章

随机推荐