为什么我不能在foreach中添加一个字典(Key,Value)?

时间:2009-01-07 17:08:24

标签: c# dictionary foreach

如果我想循环一个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");
}

8 个答案:

答案 0 :(得分:21)

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

来自MSDN Dictionary.Enumerator

  

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

但是,这很容易解决这个问题。只需复制一个字典(或它的键)并迭代它,添加/删除/等。根据需要从原始词典。

答案 1 :(得分:8)

枚举时无法修改字典,就像那样简单。否则什么时候知道你已经完成了?

答案 2 :(得分:7)

如果你想这样做,你应该得到一个字典对象的副本(可以通过多种方式完成),然后枚举它,添加你想要的原始对象。

在枚举词典时,您无法添加新项目。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

因为它会更改您正在滚动的词典的项目... 它毫无意义......(你可以永远循环)

答案 6 :(得分:0)

您正在尝试在迭代循环时更改集合中的条目数。 for循环可以实现这一点,但是foreach迭代器不允许你这样做。

答案 7 :(得分: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");
}

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