C# 将元素添加到字典中,键作为字符串,值作为另一个字典

问题描述 投票:0回答:2

背景: 我有一个字典 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();
        }
c# dictionary
2个回答
0
投票

希望您错过了这一点,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);
}

0
投票

尝试这样的事情

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);



`
© www.soinside.com 2019 - 2024. All rights reserved.