2010-02-07 75 views
6

我有一個LinkedList節點,每個節點存儲一個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- a-given-criteria – ChrisF 2010-02-07 23:04:15

+2

@Chri sF:不完全一樣 - 這個問題只是關於刪除一個元素,而不是所有的元素。 – 2010-02-07 23:08:55

+0

也許創建一個只有Edges.Count> 0的新鏈接列表會更快(而不是在舊列表中執行所有這些刪除操作)。馬克·拜爾斯解決方案將在下面做。 – Zyphrax 2010-02-07 23:22:52

回答

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));