2012-01-26 12 views
6

.NETコレクションライブラリのリストがありますが、1つの要素を削除します。残念ながら、私は他のオブジェクトと直接比較することでそれを見つけることはできません。述語でリストから要素を削除する

FindIndexRemoveAtを使用すると、複数のトラバーサルが発生する恐れがあります。

Enumeratorsを使用して要素を削除する方法はわかりません。

RemoveAll私は必要なものを行いますが、1つの要素が見つかったら停止しません。

アイデア?

+0

いくつかのコード例を表示できますか? –

+0

質問には 'linked-list'というタグが付いていますが、その説明は' List 'を示唆しています。どちらですか? – Ani

+0

あなたのリストはどのタイプですか? – Strillo

答えて

1

EDIT:あなたが唯一の最初の要素を削除したい場合は

public static void RemoveFirst<T>(LinkedList<T> list, Predicate<T> predicate) 
{ 
    var node = list.First; 
    while (node != null) 
    { 
     if (predicate(node.Value)) 
     { 
      list.Remove(node); 
      return; 
     } 
     node = node.Next; 
    } 
} 
+0

私は単一の要素を削除するだけで探しています。 – Steinbitglis

+0

@Steinbitglis:述語と一致する複数の値がありますか?どのような種類のリストを使用していますか? –

+0

@Steinbitglis:副作用を使って 'RemoveAll'を使う方法を示すために編集しました。 –

2

:今OPはLinkedList<T>を使用するように変更されている、それは限り、それが持っているとして、これだけ反復する答えを与えるのは簡単ですそれはあなたが以下の(例)を使用することができ述語に一致する:

(x => x = 10)は明らかにオブジェクトを合わせるためのあなたの述語である
List<int> list = new List<int>(); 
list.Remove(list.FirstOrDefault(x => x = 10)); 

+0

これには、リストを2回列挙する必要があります。一度一致する商品を見つける。このアイテムを再度削除するには、もう一度「削除」してください。 –

+1

True、RemoveAtを使用する方が効率的です。 – Strillo

10

List<T>述語

int index = words.FindIndex(s => s.StartsWith("x")); 
words.RemoveAt(index); 

を受け付けるFindIndex方法は、 "X" で始まる最初の単語を削除しました。この例ではwordsList<string>とします。

+0

リストに一定時間のインデックスルックアップがある場合、これは問題ありません。私は、RemoveAtもリストを横断することになるのではないかと心配していました。 – Steinbitglis

+1

@Steinbitglis:すべてをコピーする必要があるため、O(n)操作です。あなたは実際にリンクリストを望んでいましたか? –

+0

さて、私は非常に少数の要素しか持っておらず、それは往来し続けます。私は少なくともハッシュテーブルはばかだと思う。リンクリストの問題は私には分かりません。 – Steinbitglis

関連する問題