2009-01-07 6 views
2

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

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

ответ

7

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

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

0

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

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

+0

это был пример. –

8

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

0

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

21

Это из-за того, как переписчик строится.

Из MSDN Dictionary.Enumerator:

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

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

1

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

0

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

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

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

Смежные вопросы