如果我想循环一个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");
}
答案 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");
}
请注意,这是一个无限循环,因为您总是在到达最后一个条目之前添加一个人。