2010-04-13 10 views
0

일부 조건에 따라 반복하고 항목을 변경하는 데 필요한 간단한 Dictionary(of String, Object)이 있습니다.루프 내에서 콜렉션 변경

반복되는 컬렉션을 수정할 수 없으므로 어떻게해야합니까?
컬렉션이 수정 된

Dim mOptions As New Dictionary(of String, Object) 
mOptions.Add("optA", "A") 
mOptions.Add("optB", "B") 
mOptions.Add("optC", "C") 

For Each O As KeyValuePair(Of String, Object) In mOptions 
    Dim Val As Object = GetSomeOtherObjectBasedOnTheOption(O.Key, O.Value) 
    mOptions(O.Key) = Val 
Next 

잘못된 연산 예외;

예를 들어

은 분명히 다음은 Invalid Operation Exception 원인 열거 연산이 실행되지 않을 수 있습니다.

사전을 먼저 복제하고 복사본을 반복해야합니까? 그 일을하는 가장 좋은 방법은 무엇입니까?

Dim TempOptions As New Dictionary(of String, Object) 
For Each O As KeyValuePair(Of String, Object) In mOptions 
    TempOptions.Add(O.Key, O.Value) 
Next 

For Each O As KeyValuePair(Of String, Object) In TempOptions 
    Dim Val As Object = GetSomeOtherObjectBasedOnTheOption(O.Key, O.Value) 
    mOptions(O.Key) = Val 
Next 

그래도 약간의 냄새가납니다.

답변

6

에서 그것을하지 않은 당신은 방금 KeyValuePair의 이상을 통해 키의 사본 대신 반복하는을 반복 할 수 있습니다.

For Each K as String in mOptions.Keys.ToArray() 
    Dim Val As Object = GetSomeOtherObjectBasedOnTheOption(K) 
    mOptions(K) = Val 
Next 

(죄송 당신이 그냥 것을 붙여 넣을 수없는 경우 - 나는 일반적으로 VB를 쓰지 않는다)

그것은 엄격하게 배열 될 필요가 없습니다 : 당신의 VB에 해당 할 수 있습니다 foreach (string k in new List<string>(mOptions.Keys))도 있습니다.

원래 키를 반복하고 사전을 수정하면 동일한 오류가 발생합니다. 그것은 또한 VB.NET에서 가능하다면이 항복 패턴을 사용하여 수행 할 수 있습니다 C#으로

+0

나는 내가하는 일이라고 생각 ... 그렇지 않으면 당신은 그것을 할 수있는 사용자 정의는 IEnumerable을 만들 수 있습니다 몰라 이것은 잘못된 길 주위에. 열쇠 만이 아니라 값이 필요한 열쇠가 필요합니다. 그러나 접근법은 잘 작동합니다. 루프의 맨 위에있는 원래 콜렉션에서 현재 val을 얻습니다. – Cylindric

0

왜 KeyValuePair를 반복합니까?

왜 안되나요?

For Each K As String In mOptions.Keys.ToArray() 
    Dim Val As Object = GetSomeOtherObjectBasedOnTheOption(K) 
    mOptions(K) = Val 
Next 

이렇게하면 반복하는 컬렉션은 사전 자체가 아닌 사전에 액세스하는 데 사용할 수있는 문자열 목록입니다.

사전에 모든 헛소리 VB에 사과드립니다. 년

-2

+1

이 답변은 잠재적 인 오해의 소지가있는 표현으로 표현 되었기 때문에 부정적인 투표를 사용하고 VB.NET 솔루션 대신 C#을 사용합니다. 다른 말로하면 의미가 더 명확 해졌을 것입니다 : _ "사용자 정의'IEnumerable'을 구현하면됩니다. VB.NET에서 사용할 수있는 경우'yield'를 사용하십시오."_ ('yield '는 VB.NET에서 사용 가능하지 않습니다. 적어도 VS 2008에서는 그렇지 않습니다.) - 그렇긴하지만, 커스텀 반복자를 작성하는 것은 지나친 것이므로 나쁜 생각 일 수 있습니다. 더 쉬운 해결책이 있습니다. – stakx

관련 문제