首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有一种更优雅的方法可以安全地将项目添加到Dictionary<>?

有没有一种更优雅的方法可以安全地将项目添加到Dictionary<>?
EN

Stack Overflow用户
提问于 2009-07-24 13:07:09
回答 5查看 93.9K关注 0票数 167

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

没有像这样创建字符串助手方法的更优雅的方法是什么?

代码语言:javascript
复制
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;
            }
        }
    }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-07-24 13:10:07

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

代码语言:javascript
复制
Dictionary<string, object> currentViews = new Dictionary<string, object>();
currentViews["Customers"] = "view1";
currentViews["Customers"] = "view2";
currentViews["Employees"] = "view1";
currentViews["Reports"] = "view1";

基本上,如果键的存在表明存在错误(因此您希望它抛出),则使用Add,否则使用索引器。(这有点像强制转换和使用as进行引用转换之间的区别。)

如果你使用的是C# 3,并且你有一组不同的密钥,你可以让它更整洁:

代码语言:javascript
复制
var currentViews = new Dictionary<string, object>()
{
    { "Customers", "view2" },
    { "Employees", "view1" },
    { "Reports", "view1" },
};

这在你的例子中是行不通的,因为集合初始化器总是使用在第二个Customers条目上抛出的Add

票数 274
EN

Stack Overflow用户

发布于 2009-07-24 13:09:55

怎么了.

代码语言:javascript
复制
dict[key] = view;

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

票数 54
EN

Stack Overflow用户

发布于 2009-07-24 13:11:10

简单地说

代码语言:javascript
复制
dict[key] = view;

来自Dictionary.Item的MSDN文档

与指定键关联的值。如果未找到指定的键,则get操作将抛出KeyNotFoundException,而set操作将使用指定的键创建一个新元素。

我的重点

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1177517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档