문제

그래서 제거 할 버그가 있습니다

foreach (XElement x in items.Elements("x")) 
{
    XElement result = webservice.method(x);

    if (/*condition based on values in result*/) 
    {
        x.Remove();
    }
}

문제는 x.remove ()를 호출하면 두 개의 요소 ( "x")가 있고 첫 번째가 제거되면 루프가 두 번째 x 요소로 이동하지 않도록 foreach를 변경한다는 것입니다.

그렇다면 어떻게 이것을 반복해야합니까? 아니면 다른 방법으로 다시 작성해야합니까?

도움이 되었습니까?

해결책

LINQ가 다음과 같이 여기에서 당신을 도울 수 있다고 생각합니다.

using System.Linq;

void foo()
{
    items.Elements("x")
         .Where(x => condition(webservice.method(x)))
         .Remove();
}

그렇지 않은 경우 작동하지 않으면 (즉, 내부 열거자가 여전히 무효화되어 있음) 선택한 요소의 얕은 사본을 만들고 다음과 같이 삭제하십시오.

using System.Linq;

void foo()
{
    List xElements = items.Elements("x")
                          .Where(x => condition(webservice.method(x)))
                          .ToList();

    for (int i = xElements.Count - 1; i > -1; i--)
    {
        xElements[i].Remove();
    }
}

다른 팁

루프 로직 이전에 컬렉션을 만들고 새 컬렉션에 제거 할 요소를 추가 한 다음 새 컬렉션의 각 요소에서 항목을 호출하십시오.

foreach 대신에 for없이 시도하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top