当键值对为列表时,插入该值的第一个值



我有一个字典,如下所示,其中键是一个字符串,值是一个双精度列表:

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块,要么它不存在并且您创建了它(。在任何情况下,此时,您都可以将测量值添加到适当的列表中。

您有两种选择:

  1. 如果给定键有list,只需将measurement添加到现有值(即列表(
  2. 如果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);

相关内容

  • 没有找到相关文章

最新更新