2012-11-28 7 views
1

LINQ 목록에서 다중 인덱스를 제거, 나는 다음과 같은 코드를 사용하고 첫 번째와 세 번째 요소는 ForEach를 실행하여 제거합니다.내가 LINQ 목록에서 여러 인덱스를 제거 할

[편집]

문제 인덱스 동적 것도있다. 목록 (toRemove)이 큰 경우

+0

먼저 Foreach 루프를 통해 컬렉션을 수정할 수 없습니다. 제거하고자하는 인덱스 콜렉션을 가지고 있다면'slidePart.RemoveAt (Index)'를 호출하여 반복한다. (인덱스는 0부터 시작한다.) – Nogard

+0

@ 노가 드 가장 높은 색인부터 시작하는 역순. 그렇지 않으면 각 제거가 인덱스를 뒤섞어 잘못된 요소가 삭제되게합니다. (Item (0)이 제거되어 Item (2)가 Item (1)이됩니다.) – mclark1129

+0

@ 실제로, 첫번째 코멘트 – Nogard

답변

3
var toRemove = new int[] { 1,2,.... }; 

    slidePart.Slide 
     .Descendants<DocumentFormat.OpenXml.Presentation.Picture>() 
     .Where((x, i) => toRemove.Contains(i)) 
     .ToList() 
     .ForEach(pic => pic.Remove()); 

, 당신은 toRemove 약간의 선언을 변경하여 (1) O에 O (N)에서 (를 포함) 검색 시간을 줄일 수 있습니다

var toRemove = new HashSet<int>(new int[] { 1 }); 
+0

제발 내 편집을 참조하십시오. – Ali

+0

@Ali 이제 내 편집을 볼 수 있습니다 :) –

+1

@ L.B 감사합니다. :) – Ali

0

일반적으로, 당신은 여러 인덱스에서 항목을 선택 과부하 필터 Where의 색인을 사용할 수 있습니다. LINQ는 컬렉션에 대한 뷰 (다른 컬렉션 인스턴스) 만 제공하므로 원래 컬렉션을 수정할 수 없습니다. Remove 메서드가 소유자로부터 항목을 제거하는 것을 처리 할 수는 있지만 매우 특별하고 드문 경우 일 수 있습니다. 이

var toRemove = new[] { 1, 2, ... }; 

var itemsToBeRemoved = slidePart.Slide 
    .Descendants<DocumentFormat.OpenXml.Presentation.Picture>() 
    .Where((pic, index) => toRemove.Contains(index)) 
    .ToList(); 

과 같을 것이다 그러나 항목을 제거 할 수 있도록 항목을 받고 귀하의 경우에는

는, 당신은 Descendants 컬렉션 자체를 Remove 방법의 일종을 호출 할 필요하거나이있을 수 있습니다 시나리오에서 완전히 다른 접근 방식이 필요합니다.

+0

'.ToList()'는 완전히 새로운 컬렉션을 만들고 안전하게 열거 할 수 있습니다. –

+0

네 말이 맞아, 나는'pic => pic.Remove()'부분에 더 관심이있다. –

+0

내 편집을 참조하십시오. – Ali