2009-08-17 18 views
5

LinkedList<T>(.NET 2.0)で繰り返し、指定された条件に従ってすべてのアイテムを削除する必要があります。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行動にコレクションから現在の要素を削除するには、no remove方法がありません:私は次の操作を行う可能性があるので これは、Javaの下に簡単な方法でした。 また、LinkedList<T>には、指定されたインデックスの要素にアクセスして、最後から最初の順に反復してタスクを実行する方法はありません。

どうすればいいですか?どうもありがとうございました!

+3

なぜ、このコミュニティのwikiですか?それは主観的なことではありません - ここには明確な答えがあります。 –

答えて

11

この貫通一つのループで、条件に一致するすべてのノードを削除します望んでいるあなたの第二のリストを反復処理し、あなたのLinkedListに削除を呼び出す...

リンクされたリスト

私は(そう、あなたのJavaコードは、すべてのノードを削除していなかったのではなく、最初に移動します。また、リストの最初のノードに戻って追加...それはあなたがしようとしているものだと信じてい
LinkedListNode<E> node = list.First; 

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

リストの先頭にマッチする)。これは、このアプローチでも簡単に行うことができます。

+0

リストではいけません。削除(ノード)? –

1

実際はC#ではかなり簡単です。

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

それはOPが尋ねたものではありません... –

+0

これは質問とは関係ありません... –

+0

私はまだ試していませんが、これは開かれた列挙人のために例外が発生すると信じています... – Antonello

1

1つの醜い選択肢は、リストを反復し、適用するすべての項目を見つけてリストに格納することです。その後、私は他の誰かがよりエレガントな解決策を持っている:)

+0

私は実際にそのアイデアが大好きです... – Unsliced

+0

リストの2つのノードが同じである可能性があるので、それは私も考えましたが、優雅さを離れて、すべての条件で動作しませんでした... – Antonello

+0

私はワンパスバージョンを入れます下には、重複も扱います。 LinkedListを使用することに基づいています。削除(LinkedListNode ) –

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; 
    } 
関連する問題