2011-07-27 3 views
0

가능한 복제를 실행하지 않을 수 있습니다
Collection was modified; enumeration operation may not execute - why?컬렉션이 수정되었습니다. 열거 작업이

첫째을, 문맥이 여기에 확장 방법을 다루는으로 내가이 중복 질문하지 믿습니다.

Extension 메서드를 통해 한 목록에서 다른 목록으로 항목을 이동할 때이 예외가 발생합니다. 항목을 제거 할 목록이 내가 반복하는 목록이 아니기 때문에 약간 혼란 스럽습니다.

예를 들어, 최소의 확장 방법은 다음과 같을 것이다 :

public static void MoveItemsTo(this IList source, IList target, IList items) 
{ 
    foreach (var item in items) { 
     target.Add(item); 
     source.Remove(item); 
    } 
} 

이 다음과 같이 호출 방법이다 : 내가하려고하면 내가에만 오류가 발생

myCollectionOne.MoveItemsTo(myCollectionTwo, itemsToMove); 

소스 목록에서 항목을 제거하십시오. 메소드가 다른 목록을 반복하므로 약간 혼란 스럽습니다. 내가 알지 못하는 장면 뒤에 뭔가가 있어야합니다 ...

+1

확장 방법이므로 아무런 차이가 없습니다. –

+0

이것을 보여주는 예에서 3 가지 인수는 무엇입니까? –

+0

어떤 오류가 있습니까? 무슨 예외? –

답변

0

foreach 루프를 사용하는 대신 일반 for 루프를 사용하십시오. 실제로 항목 목록에서 항목을 제거하고 있습니다. 그 항목은 반복되는 항목이기 때문에. 그건 당신이 달성하기 위해 노력하고 실제로 어떤 경우 보조 노트에

for (int i = 0; i < items.Count; i++) 
{ 
    target.Add(item); 
    source.Remove(source[i]); 
} 

, 당신은 아마, for 루프 후 한 번에 전체 소스 목록을 취소 할 수 있습니다.

0

이렇게하면 원본 목록을 변경하지 않고 원본에서 대상으로 항목을 이동 한 결과의 새 목록이 반환됩니다. 이렇게하면 소스 목록을 불변 목록으로 처리하여 질문에서 refence 문제를 피할 수 있습니다.

void Main() 
{ 
    var a = new List<string>() { "a","b","c" }; 
    var b = new List<string>() { "d" }; 
    var c = a.MoveItemsTo(i=>i=="b",b); 
    c.Dump(); // { "d", "b" } 
} 

public static class Extensions 
{ 
    public static IEnumerable<T> MoveItemsTo<T>(this IEnumerable<T> source, Func<T,bool> Predicate,IEnumerable<T> DestSource) 
    { 
     var newList = new List<T>(DestSource); 
     newList.AddRange(source.Where(Predicate).ToList()); 
     return newList; 
    } 
} 
관련 문제