2

如果我想遍历 Dictionary(Key, Value)... 为什么不能在循环中添加新的键值对?

Dictionary<string, string> persons = new Dictionary<string, string>();

persons.Add("roger", "12");
persons.Add("mary", "13");

foreach (KeyValuePair<string,string> person in persons)
{
 Console.WriteLine("Name: " + person.Key + ", Age: " + person.Value);
 persons.Add("Xico", "22");
}
4

8 回答 8

21

这是因为枚举器的构造方式。

来自 MSDN Dictionary.Enumerator

只要集合保持不变,枚举数就保持有效。如果对集合进行了更改,例如添加、修改或删除元素,则枚举器将不可恢复地失效,并且其行为未定义。

不过,解决这个问题很容易。只需制作字典(或其键)的副本并遍历它,添加/删除/等。根据需要从原始字典中获取。

于 2009-01-07T17:13:23.147 回答
8

枚举时不能修改字典,就这么简单。否则你什么时候知道你已经完成了?

于 2009-01-07T17:10:24.620 回答
7

如果您想这样做,您应该获取 Dictionary Object 的副本(可以通过多种方式完成)然后枚举它,将您想要的内容添加到原始对象中。

只是在枚举字典时不能添加新项目。

于 2009-01-07T17:12:02.073 回答
1

枚举集合(即foreach 循环)时,无法从集合中添加或删除项目。想想如果允许的话会带来的所有问题。

于 2009-01-07T17:13:55.250 回答
0

那只是……奇怪。您正在尝试为字典中已有的每个人再次添加同一个人。

另外:为什么将年龄存储为字符串?int(甚至 DateTime)似乎更合适。

于 2009-01-07T17:10:04.480 回答
0

因为它会改变你正在滚动的字典的项目......它没有意义......(你可能会永远循环)

于 2009-01-07T17:12:28.110 回答
0

您试图在遍历循环时更改集合中的条目数。for 循环可以完成此操作,但 foreach 迭代器不允许您这样做。

于 2009-01-07T17:14:40.443 回答
0
Dictionary<string, string> persons = new Dictionary<string, string>();
persons.Add("roger", "12");
persons.Add("mary", "13");
for (int i = 0; i < persons.Count; i++){ 
Console.WriteLine("Name: " + persons[i].Key + ", Age: " + persons[i].Value); 
persons.Add("Xico", "22");
}

请注意,这是一个无限循环,因为您总是在到达最后一个条目之前添加一个人。

于 2009-01-07T17:17:34.183 回答