【问题标题】:C# Add elements to Dictionary with key as string and value as another DictionaryC#将元素添加到字典中,键作为字符串,值作为另一个字典
【发布时间】:2016-12-22 04:55:50
【问题描述】:

背景: 我有一个字典diskInfo,键为字符串,值为字符串类型的字典,双精度。对于 foreach 循环中的每个条目,我计算磁盘空间并将结果存储到 spaceInfo 字典中。然后将其传递以存储为 diskInfo 字典中相应键的值。

问题 每次我清除 spaceInfo 中的现有条目并在存储到 diskInfo 字典之前读取键值对。在循环结束时,diskInfo 字典正确存储了键,但所有键的值计数为 0。我是使用字典的新手,请您帮忙解释一下为什么会发生这种情况。

谢谢你

Dictionary<string, double> spaceInfo = new Dictionary<string, double>();
Dictionary<string, Dictionary<string, double>> diskInfo = new Dictionary<string, Dictionary<string, double>>();
foreach (ManagementObject mo in queryCollection)
        {
            double size = Convert.ToDouble(mo["Size"]) / divisor;
            double free = Convert.ToDouble(mo["FreeSpace"]) / divisor;

            double percentFree = (free / size) * 100;

            spaceInfo.Add("size",size);
            spaceInfo.Add("freeSpace",free);
            spaceInfo.Add("percentFree",percentFree);

            diskInfo.Add(Convert.ToString(mo["Name"]),spaceInfo);

            spaceInfo.Clear();
        }

【问题讨论】:

  • put Dictionary spaceInfo = new Dictionary();在循环中,并删除 spaceinfo.clear();
  • 另外,您可以使用类而不是字典来获取空间信息。

标签: c# dictionary


【解决方案1】:

希望您错过了这一点,Dictionary 是一个引用类型变量,因此如果您在实例中进行任何更改意味着它将反映所有位置,因此必须在每次迭代中创建单独的实例, 你应该尝试这样的事情:

foreach (ManagementObject mo in queryCollection)
{
   double size = Convert.ToDouble(mo["Size"]) / divisor;
   double free = Convert.ToDouble(mo["FreeSpace"]) / divisor;
   double percentFree = (free / size) * 100;

   // Adding items here

   diskInfo.Add(mo["Name"].ToString(), new Dictionary<string, double>()
                                       {
                                           {"size",size},
                                           {"freeSpace",free},
                                           {"percentFree",percentFree}    
                                       } 

}

甚至可以通过对您的代码进行少量修改来实现这一点;这意味着您必须在每次迭代中创建 spaceInfo 的新实例,而不是清除它们。

foreach (ManagementObject mo in queryCollection)
{
    double size = Convert.ToDouble(mo["Size"]) / divisor;
    double free = Convert.ToDouble(mo["FreeSpace"]) / divisor;
    double percentFree = (free / size) * 100;

    spaceInfo = new Dictionary<string, double>();
    spaceInfo.Add("size",size);
    spaceInfo.Add("freeSpace",free);
    spaceInfo.Add("percentFree",percentFree);

    diskInfo.Add(Convert.ToString(mo["Name"]),spaceInfo);
}

【讨论】:

    【解决方案2】:

    试试这样的东西

    diskInfo.Add(Convert.ToString(mo["Name"]), new Dictionary<string, double>(spaceInfo));
    

    浅拷贝造成的问题。 您必须执行深度复制以避免此类问题。 Dictionary 类中的复制构造函数可能会帮助您解决问题,因为它会从 spaceInfo 对象创建新实例。

    但更好的方法是为 SpaceInformation 创建类。

    class SpaceInfo
    {
        private double _size;
        private double _free;
        private double _percentFree;
    
        public double Size
        {
            get;
            set;
        }
    
        public double Free 
        {
            get;
            set;
        }
    
        public double PercentFree
        {
            get;
            set ;
        }
    
        public SpaceInfo(double size, double free)  
        {
            Size = size;
            Free = free;
            PercentFree = (free / size) * 100;
        }
    }
    
     /*Inside the loop*/
     double size = Convert.ToDouble(mo["Size"]) / divisor;
     double free = Convert.ToDouble(mo["FreeSpace"]) / divisor;
     SpaceInfo spaceInfo = new SpaceInfo(size, free);
     Dictionary<string, SpaceInfo> diskInfo = new Dictionary<string, SpaceInfo>();
     diskInfo.Add(Convert.ToString(mo["Name"]), spaceInfo);
    
    
    
    `
    

    【讨论】:

    • 为什么我的答案现在被否决了?出了什么问题?
    猜你喜欢
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 2018-09-22
    • 1970-01-01
    • 2021-12-30
    • 2017-12-17
    相关资源
    最近更新 更多