Почему я не могу добавить словарь (ключ, значение) в foreach? - PullRequest
2 голосов
/ 07 января 2009

Если я хочу перебрать словарь (ключ, значение) ... почему я не могу добавить новую пару ключ-значение в цикле?

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 ]

21 голосов
/ 07 января 2009

Это из-за способа построения счетчика.

Из MSDN Dictionary.Enumerator :

Перечислитель остается действительным до тех пор, пока коллекция остается неизменной. Если в коллекцию вносятся изменения, такие как добавление, изменение или удаление элементов, перечислитель безвозвратно аннулируется и его поведение не определено.

Это достаточно легко обойти, хотя. Просто сделайте копию словаря (или его ключей) и переберите его, добавив / удалив / etc. из оригинального словаря по мере необходимости.

8 голосов
/ 07 января 2009

Вы не можете изменить словарь при перечислении, просто так. В противном случае, когда вы знаете, что вы сделали?

7 голосов
/ 07 января 2009

Если вы хотите сделать это, вы должны получить копию объекта Dictionary (это можно сделать разными способами), затем перечислить его, добавить то, что вы хотите к оригиналу.

Просто вы не можете добавлять новые элементы при перечислении словаря.

1 голос
/ 07 января 2009

При перечислении коллекции (то есть цикла foreach) невозможно добавить или удалить элементы из коллекции. Подумайте обо всех проблемах, которые могли бы возникнуть, если бы это было разрешено.

0 голосов
/ 07 января 2009
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");
}

Помните, что это бесконечный цикл, потому что вы всегда добавляете человека, прежде чем попасть к последней записи.

0 голосов
/ 07 января 2009

Вы пытаетесь изменить количество записей в коллекции, повторяя цикл. Цикл for может выполнить это, но итератор foreach не позволит вам сделать это.

0 голосов
/ 07 января 2009

Потому что это изменит элементы словаря, которые вы прокручиваете ... Это не имеет смысла ... (и вы можете зацикливаться вечно)

0 голосов
/ 07 января 2009

Это просто ... странно. Вы пытаетесь добавить того же человека снова для каждого человека, уже находящегося в словаре.

Также: зачем хранить возраст как строку? int (или даже DateTime) кажется гораздо более подходящим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...