【问题标题】:Setting value in jagged dictionary sets all values在锯齿状字典中设置值会设置所有值
【发布时间】:2011-08-07 19:05:04
【问题描述】:

我有一本参差不齐的字典:

 Dictionary<string, Dictionary<int, Dictionary<string, string>>> tierOptions = new Dictionary<string, Dictionary<int, Dictionary<string, string>>>();

稍后,我有代码在数组中设置这些值之一:

 tierOptions[optionID][npID]["tName"] = cboTier.Text;

问题在于,当它运行这部分代码时,所有“tName”元素都设置为 cboTier.Text 而不仅仅是一个元素。

例如,如果 optionID 为 1,npID 为 8,我有这三个:

 tierOptions[1][8]["tName"]
 tierOptions[2][8]["tName"]
 tierOptions[3][8]["tName"]

特定的代码行将设置所有三个,而不仅仅是 tierOptions[1][8]["tName"]

知道为什么要这样做吗?谢谢!

【问题讨论】:

  • 告诉我们你初始化你的字典(不是数组顺便说一句)。当您需要不同的对象时,您可能会使用相同的对象。
  • 对不起,有一个原始字典被多次添加到较大的字典中,所以这可能就是问题所在。但是,这是我初始化它的方式,也许您可​​以告诉我为什么会导致问题: tierOptions.Add(optionText, new Dictionary>()); tierOptions[optionText] = BestClass.tieringInfo;
  • 所以从听上去,我应该有一个单独初始化的字典,将其设置为tieringInfo,然后将其添加到主字典中?
  • 与您的问题无关,但您应该认真考虑使用var 代替声明左侧的变量类型。
  • 感谢您的推荐。除了更少的代码之外,还有什么好处?另外,我注意到 tieringInfo 本来不应该是静态的,但这并没有解决问题。我也让它先设置一个局部变量,然后将其添加到字典中,但是当只有一个变量时,它们仍然会发生变化。

标签: c# dictionary jagged-arrays


【解决方案1】:

听起来就像您在多个“维度”(您的术语)中使用了相同的字典实例。由于这是一个参考,它们都是共享的(这里没有自动克隆到隔离副本)。

填充数据时,当数据应该分开时,请注意使用隔离的字典实例。

【讨论】:

  • 听起来就是这样。首次加载表单时,它会提取基本信息。字典中的每个添加都应添加该初始信息的克隆。创建此克隆的最佳方法是什么?
  • 经过快速测试,我确实验证了这实际上是问题所在。但是,我不想多次收集数据,而是想获取一次,将其存储在变量中,然后尽可能复制锯齿状字典。我已经做了一些快速搜索,这似乎不太容易实现。有什么想法吗?
【解决方案2】:

是的,我会说 sae 作为 Marc。 请看一下这个示例,如何从您的字典类型中检索 vlaue:

        Dictionary<string, Dictionary<int, Dictionary<string, string>>> dic = new Dictionary<string, Dictionary<int, Dictionary<string, string>>>();
        //add to 1st dic:
        dic.Add("A", new Dictionary<int, Dictionary<string, string>>());
        //add to 2nd dic:
        dic["A"].Add(1, new Dictionary<string, string>());
        //add to 3rd dic:
        dic["A"][1].Add("a", "value 1");

        //string KeyIn3rdDic = dic["A"][1].ToString();
        string ValueIn3rdDic = dic["A"][1]["a"]; //result is "value 1";        

【讨论】:

    猜你喜欢
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多