代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

有没有一种更优雅的方法可以安全地将项目添加到字典中?

  •  115
  • Edward Tanguay  · 技术社区  · 16 年前

    我需要向字典中添加键/对象对,但我当然需要首先检查键是否已经存在,否则我会得到一个“ 字典中已存在键 “错误。下面的代码解决了这一问题,但是很笨拙。

    在不使用这样的字符串助手方法的情况下,更优雅的方法是什么?

    using System;
    using System.Collections.Generic;
    
    namespace TestDictStringObject
    {
        class Program
        {
            static void Main(string[] args)
            {
                Dictionary<string, object> currentViews = new Dictionary<string, object>();
    
                StringHelpers.SafeDictionaryAdd(currentViews, "Customers", "view1");
                StringHelpers.SafeDictionaryAdd(currentViews, "Customers", "view2");
                StringHelpers.SafeDictionaryAdd(currentViews, "Employees", "view1");
                StringHelpers.SafeDictionaryAdd(currentViews, "Reports", "view1");
    
                foreach (KeyValuePair<string, object> pair in currentViews)
                {
                    Console.WriteLine("{0} {1}", pair.Key, pair.Value);
                }
                Console.ReadLine();
            }
        }
    
        public static class StringHelpers
        {
            public static void SafeDictionaryAdd(Dictionary<string, object> dict, string key, object view)
            {
                if (!dict.ContainsKey(key))
                {
                    dict.Add(key, view);
                }
                else
                {
                    dict[key] = view;
                }
            }
        }
    }
    
    5 回复  |  直到 16 年前
        1
  •  213
  •   Jon Skeet    16 年前

    只需使用索引器-如果它已经存在,它将覆盖,但它不覆盖 先到那里:

    Dictionary<string, object> currentViews = new Dictionary<string, object>();
    currentViews["Customers"] = "view1";
    currentViews["Customers"] = "view2";
    currentViews["Employees"] = "view1";
    currentViews["Reports"] = "view1";
    

    基本使用 Add 如果键的存在表明存在错误(所以您希望它抛出),则索引器将不存在。(这有点像铸造和使用的区别 as 用于参考转换。)

    如果你用的是C 3 你有一套独特的钥匙 你可以让它更干净:

    var currentViews = new Dictionary<string, object>()
    {
        { "Customers", "view2" },
        { "Employees", "view1" },
        { "Reports", "view1" },
    };
    

    不过,在您的情况下不起作用,因为集合初始值设定项始终使用 添加 在第二个上面 Customers 条目。

        2
  •  41
  •   Mehrdad Afshari    16 年前

    怎么了…

    dict[key] = view;
    

    如果密钥不存在,它将自动添加密钥。

        3
  •  20
  •   Steve Gilham    16 年前

    简单地

    dict[key] = view;
    

    来自dictionary.item的msdn文档

    与 指定键。如果指定的键是 找不到,get操作引发 keynotfoundexception,和 设置 操作创建一个新元素 指定的密钥 .

    我的重点

        4
  •  10
  •   rohancragg    16 年前

    像往常一样,约翰·斯基特用正确的答案以光速进入,但有趣的是,你也可以在IDictionary上编写一个扩展方法safeadd。

    public static void SafeAdd(this IDictionary<K, T>. dict, K key, T value)...
    
        5
  •  6
  •   Daniel Earwicker    16 年前

    尽管使用索引器显然是解决特定问题的正确答案,但对于向现有类型添加附加功能的问题,另一个更一般的答案是定义扩展方法。

    显然,这不是一个特别有用的例子,而是下次你发现真正需要时要记住的东西:

    public static class DictionaryExtensions
    {
        public static void SafeAdd<TKey, TValue>(this Dictionary<TKey, TValue> dict, 
                                                 TKey key, TValue value)
        {
            dict[key] = value;
        }
    }