2010-02-07 84 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));