【问题标题】:How to I add an item to a Dictionary<string, Dictionary<string, object>>?如何将项目添加到 Dictionary<string, Dictionary<string, object>>?
【发布时间】:2009-07-23 15:44:28
【问题描述】:

我希望我的 LayoutManager 类的用户能够这样写:

LayoutManager layoutManager = new LayoutManager();
layoutManager.AddMainContentView("customers", "intro", 
    new View { Title = "Customers Intro", Content = "This is customers intro." });

但是我需要什么语法才能在下面的 AddMainContentView() 中的字典中填充这个字典?

public class LayoutManager
{
    private Dictionary<string, Dictionary<string, object>> _mainContentViews = new Dictionary<string, Dictionary<string, object>>();
    public Dictionary<string, Dictionary<string, object>> MainContentViews
    {
        get { return _mainContentViews; }
        set { _mainContentViews = value; }
    }

    public void AddMainContentView(string moduleKey, string viewKey, object view)
    {
        //_mainContentViews.Add(moduleKey, new Dictionary<string, object>(viewKey, view));
        //_mainContentViews.Add(moduleKey, viewKey, view);
        _mainContentViews.Add(moduleKey, ???);
    }

    ...
}

【问题讨论】:

    标签: c# collections dictionary


    【解决方案1】:
    public void AddMainContentView(string moduleKey, string viewKey, object view)
    {
        Dictionary<string, object> viewDict = null;
        if (!MainContentViews.TryGetValue(moduleKey, out viewDict)) {
            viewDict = new Dictionary<string, object>();
            MainContentViews.Add(moduleKey, viewDict);
        }
        if (viewDict.ContainsKey(viewKey)) {
            viewDict[viewKey] = view;
        } else {
            viewDict.Add(viewKey, view);
        }
    }
    

    【讨论】:

    • 根据语义,您可以选择:“viewDict[viewKey] = view;”或“viewDict.Add(viewKey, view);”但你不需要两者。您的语义现在等同于第一个选项。
    【解决方案2】:

    ???可以填写:

    new Dictionary<string, object> { {viewKey, view} }
    

    【讨论】:

      【解决方案3】:

      这行得通吗:

      public void AddMainContentView(string moduleKey, string viewKey, object view)
      {
          if ( !_mainContentViews.ContainsKey(moduleKey))
          {
             Dictionary<string, object> newModule = new Dictionary<string, object>();
             newModule.Add(viewKey, view);
      
             _mainContentViews.Add(moduleKey, newModule);
          }
      }
      

      【讨论】:

        【解决方案4】:

        要么使用元组作为键(即没有嵌套字典,而只是一个合并的键)并再次添加变得简单,或者您需要检查 moduleKey 是否存在,如果不存在则首先创建一个新的空字典。

        如果可能,请使用元组键而不是嵌套字典 - 唯一的问题就是唯一标识模块的所有成员,如果您正在处理不超过几千个元素的合理小集合,您可以安全地暴力破解。

        【讨论】:

          猜你喜欢
          • 2014-10-22
          • 2012-03-01
          • 2012-05-13
          • 1970-01-01
          • 1970-01-01
          • 2012-09-21
          • 1970-01-01
          • 1970-01-01
          • 2019-01-29
          相关资源
          最近更新 更多