2012-04-23 2 views
6

나는 Dictionary<string, IEnumerable<string>> 유형의 사전과 문자열 값 목록을 가지고 있습니다. 어떤 이유로 Add를 할 때마다 사전의 모든 값을 덮어 씁니다. 왜 이런 일이 벌어지고 있는지에 대해 완전히 혼란 스럽습니다. 루프의 IEnumberable 객체를 선언하고 초기화하여 참조의 문제가 아닌지 확인하여 스코프가 하나의 반복 밖에 있지 않고 여전히 수행합니다. typelistIEnumerable<string>입니다Dictionary.Add가 사전의 모든 항목을 덮어 쓰는 이유는 무엇입니까?

foreach (string type in typelist) 
{ 
    IEnumerable<string> lst = 
     from row in root.Descendants() 
     where row.Attribute("serial").Value.Substring(0, 3).Equals(type) 
     select row.Attribute("serial").Value.Substring(3).ToLower(); 

    serialLists.Add(type, lst); 
} 

rootXElement이며, serialLists 내 사전입니다 : 여기 내 코드입니다.

+4

:

는 여기를 해결하는 한 가지 쉬운 방법입니다. 추가 한 모든 lst는 * last *'type' 변수를 사용합니다. 다음을 읽어보십시오 : http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx 흥미롭게도이 문제는 C와 함께 사라집니다. # 5! – dlev

+1

나는 그것을 확실히 읽을 것입니다. 도와 주신 모든 분들께 다시 한번 감사드립니다! – Annath

답변

10

이것은 캡처 된 반복기 문제입니다.

시도 :

foreach (string tmp in typelist) 
{ 
    string type = tmp; 

(변경되지 않은 나머지)

또한, 나는 추가, 즉 동안 식을 계산할 것 .Add에()를 .ToList을 : 그것은 그렇지 않으면 필요하지 않을 수도 있습니다 thigs의 평가를 강제 않지만

    serialLists.Add(type, lst.ToList()); 

두 번째 옵션은 전체 아마 더 효과적입니다.

+0

감사! 바로 문제가 해결되었습니다. – Annath

6

이유는 IEnumerable<string> 시퀀스 열심히 채워되지 않는 것입니다 만, 온 디맨드, foreach 루프는 모든 반복을 완료 한 것이다. 따라서 어떤 IEnumerable<string> 시퀀스가 ​​열거되면 type 변수는 항상 typelist의 마지막 요소 값을가집니다. 당신은 "루프 변수 닫혀"한

foreach (string type in typelist) 
{ 
    string typeCaptured = type; 

    IEnumerable<string> lst = 
     from row in root.Descendants() 
     where row.Attribute("serial").Value.Substring(0, 3).Equals(typeCaptured) 
     select row.Attribute("serial").Value.Substring(3).ToLower(); 

    serialLists.Add(typeCaptured, lst); 
} 
관련 문제