2009-08-17 92 views
5

我需要遍歷一個LinkedList<T>(在.NET 2.0中)並根據給定條件移除所有項目。 這是Java的下簡單的方法,因爲我能做到以下幾點:LinkedList <T>(2.0):迭代移除項目

Iterator<E> 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<T>(的Iterator<E>等效)的.NET行爲沒有remove方法從集合中刪除當前元素。 另外,在LinkedList<T>中,沒有辦法訪問給定索引處的元素,通過從最後一個迭代回到第一個來完成任務。

你有什麼想法如何做到這一點?非常感謝你!

+3

爲什麼這是一個社會維基?這不是一種主觀的東西 - 這裏有一個明確的答案。 – 2009-08-17 16:03:10

回答

11

這將刪除匹配條件的所有節點,在一個循環鏈表。

LinkedListNode<E> node = list.First; 

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

我相信這是你嘗試什麼......您也加入早在節點在列表的開始(所以你的Java代碼沒有刪除所有節點,而是移動的第一匹配到列表的開頭)。這種方法也很容易做到。

+0

不應該是list.Remove(node)? – 2018-03-08 23:52:54

1

它實際上在C#中更容易。

function PlaceAtHead(<T> x) 
{ 
    list.Remove(x); 
    list.AddFirst(x); 
    return x; 
} 
+0

這不是什麼OP問... – 2009-08-17 15:51:11

+0

這與問題無關... – 2009-08-17 15:52:00

+0

我還沒有嘗試過,但我相信這會引發一個例外,因爲開放的枚舉器... – Antonello 2009-08-17 15:52:22

1

一個醜陋的選擇是迭代你的列表,找到所有應用並存儲在列表中的項目。然後通過你的第二個列表進行迭代,並呼籲取消對您的LinkedList ...

我希望別人有過一個更好的解決方案:)

+0

我其實很喜歡這個想法... – Unsliced 2009-08-17 15:54:36

+0

這就是我的想法,但除了優雅之外,它不能在任何情況下工作,因爲列表中的2個節點可能是相等的... – Antonello 2009-08-17 15:55:33

+0

我放了一個pass版本下面,這也將處理重複。它基於使用LinkedList 。Remove(LinkedListNode ) – 2009-08-17 16:02:39

0

只是一點點除了Reed Copsey's answer與謂詞:

public static T MoveAheadAndReturn<T>(LinkedList<T> ll, Predicate<T> pred) 
    { 
     if (ll == null) 
      throw new ArgumentNullException("ll"); 
     if (pred == null) 
      throw new ArgumentNullException("pred"); 


     LinkedListNode<T> 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; 
    }