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

StackOverflow https://stackoverflow.com/questions/421155

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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");
}
Это было полезно?

Решение

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

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

Другие советы

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

Из MSDN Dictionary.Enumerator :

  

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

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

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

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

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

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

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

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

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");
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top