我有一个字典,如下所示,其中键是一个字符串,值是一个双精度列表:
Dictionary<string, List<double>> dataStore = new Dictionary<string, List<double>>();
List<string> channel_names = new List<string>(); // contains the keys
现在,当我想向这个字典添加数据时,我会:
if (dataStore.ContainsKey(channel_names[j]))
{
dataStore[channel_names[j]].Add(measurement);
}
else
{
dataStore.Add(channel_names[j], new List<double>((int)measurement));
}
第一个语句(添加到现有密钥(工作正常,但第二个语句有问题,即当我试图用列表中的第一个双精度初始化密钥时。第一次测量被遗漏了。谁能告诉我为什么?
感谢
您正在使用构造函数List(int)
,其中int
指定列表的初始容量;它不会将该数字添加到列表中。
您可以使用集合初始化程序语法:
new List<double> { measurement }
您可以将代码重构为以下解决方案:
if (!dataStore.ContainsKey(channel_names[j]))
{
dataStore.Add(channel_names[j], new List<double>());
}
dataStore[channel_names[j]].Add(measurement);
无论ContainsKey
方法的结果如何,measurment
总是被添加到列表中,这将更加清楚。
List<T>
有两个构造函数,它们做不同的事情。
当您调用新的List<T>(int)
时,您将创建一个具有所提供大小的新列表,或者更确切地说,是该列表的初始容量。
当你想一次创建并填写一个新的列表时,你应该使用一个集合初始化器:
dataStore.Add(channel_names[j], new List<double> { measurement });
作为助手,你可以简化你的代码:
if (!dataStore.ContainsKey(channel_names[j]))
{
dataStore[channel_names[j]] = new List<int>();
}
dataStore[channel_names[j]].Add(measurement);
正如我在评论和其他人提到的那样,在构建列表时,您并没有向列表添加内容,而是在为列表分配容量。你想要的代码是:
if (!dataStore.ContainsKey(channel_names[j]))
{
dataStore.Add(channel_names[j], new List<double>();
}
dataStore[channel_names[j]].Add(measurement);
如果字典中不包含所需的关键字,则创建一个新列表并将其添加到字典中。在这一点上,字典必然包含适当的键(它要么已经存在并且您跳过了if
块,要么它不存在并且您创建了它(。在任何情况下,此时,您都可以将测量值添加到适当的列表中。
您有两种选择:
- 如果给定键有
list
,只需将measurement
添加到现有值(即列表( - 如果
dataStore
没有密钥,您应该添加整个密钥-值对:密钥(channel_names[j]
(和带有一个项目的值
代码:
if (dataStore.TryGetValue(channel_names[j], out var list))
// the key exists; just add measurement to the existing list
list.Add(measurement);
else
// no key found; add key-value pair: key and a list with one item
dataStore.Add(channel_names[j], new List<double>() {measurement});
List<T>
上接受整数的构造函数不会将该整数添加到列表中。它正在设置列表的容量。
相反,你可以使用初始化器。。。
dataStore.Add(channel_names[j], new List<double>() { measurement };
或者,您可以使用Dictionary.TryGetValue
为给定的string
找到List<double>
,如果它不存在,则添加它,然后修改它。
List<double> values = null;
if (!dataStore.TryGetValue(channel_names[j], out values))
{
values = new List<double>();
dataStore.Add(channel_names[j], values);
}
values.Add(measurement);