2011-08-23 7 views
6

나는 사전이 있습니다사전 항목을 반복하는 동안 값을 업데이트하는 방법은 무엇입니까?

Dictionary<string, long> Reps = new Dictionary<string, long>(); 

과 같이, 모든 항목을 반복하는 동안이 값을 업데이트 할 :

"Collection was modified; enumeration operation may not execute" 
:

foreach (string key in Reps.keys) 
{ 
    Reps[key] = 0; 
} 

이 나에게 말하는 오류를주고있다

누구나 왜이 오류를 내게 알려줄 수 있습니까? 왜냐하면 값을 추가하는 함수가 하나 더 있고 버튼을 클릭 할 때 호출되기 때문입니다.

public static void Increment(string RepId, int amount) 
{ 
    long _value = Convert.ToInt64(Reps[RepId]); 
    _value = _value + amount; 
    Reps[RepId] = _value; 
} 

이 함수는 정상적으로 작동합니다. 그래서 모든 값을 업데이트 할 때 문제가 무엇입니까? 그리고 이것에 대한 해결책은 무엇입니까?

답변

4

더 단순화, 이렇게 : 그것은 또한 원래의 객체를 가리키는으로

var repscopy = Reps; 
foreach (string key in repscopy.keys) 
    { 
     Reps[key] = 0; 
    } 

은 같은 오류를 줄 것이다, 그리고 ToList()가 추가 될 때이 목록의 새로운 객체를

4

문제는 값을 업데이트하는 것이 아니므로 foreach가 반복되는 동안 foreach()가 기반으로하는 모음을 변경할 수 없습니다. 이 작업을 것이

List<string> keylist = Reps.keys.ToList(); 
foreach(string r in keylist) 
{ 
Reps[r] = 0; 
} 

같은

해보십시오 somehting.

+1

의 wokring하지만 당신은 하나 답했다 생성 내 questi의 일부 해결책에 대해 ... 오류의 원인에 대해 자세히 설명 할 수 있습니까? –

+1

foreach는 컬렉션을 기반으로하기 때문에 추측합니다. 컬렉션을 변경하면 foreach가 처리 할 부분을 결정할 수 있습니까? 예 : 반복하는 동안 새 Reps [x]를 추가하면 foreach에 참여할 것인지 아닌지 예상 할 수 있습니까? – Pleun

3

foreach으로 반복하면서 Dictionary<string, long>의 요소를 변경하기 때문에 이러한 현상이 발생합니다. 이 시도.

foreach (string key in Reps.Keys.ToList()) 
{ 
    Reps[key] = 0; 
} 

이제는 사전 키로 만든 목록을 반복합니다. 수정 된 원본 컬렉션이 아니기 때문에 오류가 사라집니다.

foreach (string key in Reps.keys.ToList()) 
{ 
    Reps[key] = 0; 
} 

및 오류의 이유는 당신이 사용중인 실제 개체를 편집하려고하고 다음의 사본을 만들 경우 다음과 같이 사용하는 것입니다 :

관련 문제