왜 내가 사전 (키, 가치)을 foreach에 넣을 수 없습니까?
-
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");
}
해결책
이 작업을 수행하려면 사전 객체의 사본을 가져와야합니다 (여러 가지 방법으로 수행 할 수 있음)를 열거하고 원본에 원하는 것을 추가하십시오.
간단히 사전을 열거하는 동안 새 항목을 추가 할 수 없습니다.
다른 팁
열거자가 구성되는 방식 때문입니다.
MSDN에서 Dictionary.enumerator:
컬렉션이 변경되지 않은 한 열거자는 유효합니다. 요소를 추가, 수정 또는 삭제하는 것과 같은 컬렉션이 변경되는 경우, 열거자는 무효화되지 않고 동작이 정의되지 않습니다.
그래도이 문제를 해결하기에 쉽습니다. 사전 (또는 키)의 사본을 만들고 그것을 통해 반복하여/etc를 추가/제거하십시오. 필요에 따라 원래 사전에서.
열거 할 때 사전을 수정할 수는 없습니다. 그렇지 않으면 언제 끝났다는 것을 알고 있습니까?
컬렉션을 열거 할 때 (즉, Foreach 루프) 컬렉션에서 항목을 추가하거나 제거 할 수 없습니다. 허용 된 경우 가져올 모든 문제를 생각해보십시오.
그냥 ... 홀수입니다. 당신은 이미 사전에있는 각 사람에 대해 같은 사람을 다시 추가하려고합니다.
또한 : 왜 나이를 끈으로 저장합니까? int (또는 DateTime)가 훨씬 더 적합 해 보입니다.
그것은 당신이 스크롤하고있는 사전의 항목을 바꿀 것이기 때문에 ... 의미가 없습니다 ... (그리고 당신은 영원히 반복 할 수 있습니다)
루프를 반복하면서 컬렉션의 항목 수를 변경하려고합니다. 루프 용 A는이를 달성 할 수 있지만 Foreach Ierater는 그렇게 할 수 없습니다.
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");
}
마지막 항목에 도착하기 전에 항상 사람을 추가하기 때문에 이것은 무한 루프입니다.