LinkedList (2.0):迭代删除项目

我需要迭代LinkedList (在.NET 2.0中)并根据给定的条件删除所有项目。 这是Java下的简单方法,因为我可以执行以下操作:

 Iterator i = list.iterator(); while (i.hasNext()) { E e = i.next(); if (e == x) { // Found, so move it to the front, i.remove(); list.addFirst(x); // Return it return x; } } 

不幸的是,在IEnumerator的.NET行为(相当于Iterator )中,没有remove方法来从集合中删除当前元素。 此外,在LinkedList ,无法访问给定索引处的元素,通过从最后一个迭代到第一个来完成任务。

你知道怎么做吗? 非常感谢你!

这将通过链接列表在一个循环中删除符合条件的所有节点。

 LinkedListNode node = list.First; while (node != null) { var next = node.Next; if (node.Value == x) { list.Remove(e); } node = next; } 

我相信你正在尝试…你还在列表开头的节点中添加了回来(因此你的java代码没有删除所有节点,而是将第一个匹配移动到列表的开头) )。 这种方法也很容易做到。

它在C#中实际上要容易得多。

 function PlaceAtHead( x) { list.Remove(x); list.AddFirst(x); return x; } 

一个丑陋的选择是遍历您的列表,找到所有适用的项目并将它们存储在列表中。 然后遍历你的第二个列表并在你的LinkedList上调用remove …

我希望别人有一个更优雅的解决方案:)

Reed Copsey对谓词的回答只是一点点补充:

  public static T MoveAheadAndReturn(LinkedList ll, Predicate pred) { if (ll == null) throw new ArgumentNullException("ll"); if (pred == null) throw new ArgumentNullException("pred"); LinkedListNode node = ll.First; T value = default(T); while (node != null) { value = node.Value; if (pred(value)) { ll.Remove(node); ll.AddFirst(node); break; } node = node.Next; } return value; }