c# - 从字典中组合 "Check Add or Fetch"

标签 c# collections syntax dictionary extension-methods

我厌倦了这个字典习语:

        Dictionary<Guid,Contact> Contacts;
        //...
        if (!Contacts.ContainsKey(id))
        {
            contact = new Contact();
            Contacts[id] = contact;
        }
        else
        {
            contact = Contacts[id];
        }

如果有一种语法允许从默认构造函数隐式创建新值(如果它不存在)(毕竟字典知道值的类型),那就太好了。有人见过这样做的助手(例如扩展方法)吗?

最佳答案

实现:

public static TValue GetOrAdd<TKey, TValue>(this IDictionary<TKey, TValue> dictionary,
                                            TKey key, Func<TValue> valueCreator)
{
    TValue value;
    if (!dictionary.TryGetValue(key, out value))
    {
        value = valueCreator();
        dictionary.Add(key, value);
    }
    return value;
}

public static TValue GetOrAdd<TKey, TValue>(this IDictionary<TKey, TValue> dictionary,
                                            TKey key) where TValue : new()
{
   return dictionary.GetOrAdd(key, () => new TValue());
}

用法:

var contacts = new Dictionary<Guid, Contact>();
Guid id = ...

contacts.GetOrAdd(id).Name = "Abc"; // ok since Contact has public parameterless ctor
contacts.GetOrAdd(id, () => new Contact { Name = "John Doe" }).Age = 40;

关于c# - 从字典中组合 "Check Add or Fetch",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3705950/

相关文章:

c# - 要实现什么 Web 服务以便从 iphone 应用程序中轻松读取?

laravel - 在查询执行后从 Eloquent 集合中选择某些列

字符串操作的 C 语法建议?

c# - 使用 VSTS Git API C# 获取分支项目

c# - 如何在 Windows 10 UWP 中从屏幕右侧打开弹出窗口?

c# - 集合被修改;即使对行计数应用验证,枚举操作也可能不会执行?

java - 将 HashMap 转换为 JSONArray,值无法正确输入

php - 函数中使用语句不明确的语法错误

C++头文件——语法问题

c# - 命名空间 "Interaction"中不存在名称 "http://schemas.microsoft.com/expression/2010/interactivity"