背景: 我有一个字典 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();
}
希望您错过了这一点,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);
}
尝试这样的事情
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);
`