2010-02-07 3 views
6

나는 각각 Linked Edge의 가장자리를 저장하는 LinkedList 노드를 가지고있다.C# : LinkedList에 술어를 사용하는 RemoveAll 메서드가없는 이유는 무엇입니까?

nodes.RemoveAll(n => n.edges.Count == 0) 

줄을 따라 무언가를하고 싶었지만 RemoveAll을 사용하지 않았다. 나는 왜 다른 컬렉션이 그것을 가지고 있기 때문에 그것을 가지고 있지 않은지 이해하지 못한다. 이렇게하면 모든 요소를 ​​반복해야하고, 이해할 수있는 항목을 한 번에 하나씩 제거해야합니다. 링크드리스트의 경우 성능면에서 좋지 않을 것입니다.

지금 내가 대신 이렇게해야합니다 : 그것은 작동하지만, 그것은 일을 그들이 무엇보다 복잡 보일 수

for (LinkedListNode<MyNode> n2 = nodes.First; n2 != null;) 
{ 
    LinkedListNode<MyNode> temp = n2.Next; 
    if (n2.Value.edges.Count == 0) 
     nodes.Remove(n2); 
    n2 = temp; 
} 

.

+0

이미 요청 - http://stackoverflow.com/questions/133487/how-do-i-remove-elements-from-a-linkedlist-in-c-that-match- 주어진 기준 – ChrisF

+2

@Chri sF : 그다지 똑같은 질문은 모든 요소가 아니라 하나의 요소를 제거하는 것이 었습니다. –

+0

아마 Edges.Count> 0만으로 새로운 LinkedList를 생성하는 것이 더 빠를 것입니다 (이전 목록에서 Remove 액션을 모두 수행하는 대신). Mark Byers 솔루션을 사용하면됩니다. – Zyphrax

답변

8

왜 그 방법이 존재하지 않는지 말할 수 없습니다. 가지고있는 것이 유용한 방법으로 보일 것입니다. 확장 메서드를 사용하여 직접 추가 할 수 있습니다.

public static class LinkedListExtensions 
{ 
    public static void RemoveAll<T>(this LinkedList<T> linkedList, 
            Func<T, bool> predicate) 
    { 
     for (LinkedListNode<T> node = linkedList.First; node != null;) 
     { 
      LinkedListNode<T> next = node.Next; 
      if (predicate(node.Value)) 
       linkedList.Remove(node); 
      node = next; 
     } 
    } 
} 

다음이 작동 :

nodes.RemoveAll(n => n.edges.Count == 0); 

가 또는 당신은 유지하려는 요소를 선택하는 기준을 반전하고 만들 수 여기에 그 일에 내 (아마 나쁜, 그리고 테스트) 시도이다 그들로부터 새로운 LinkedList :

nodes = new LinkedList<MyNode>(nodes.Where(n => n.edges.Count != 0)); 
관련 문제