2011-09-14 6 views
3

条件に基づいて複数のアイテムを削除するより良い方法はありますか?最初にリストにキーを保存し、それを繰り返して各アイテムを1つずつ削除する以外の方法がありますか? Genericリストは、匿名関数を渡すことができる "RemoveAll"メソッドを提供しますが、HashTableには同等のアプローチがないようです。注:私は.NET Framework 2.0を使用していますループ内のHashtableからアイテムを削除する

+0

ハッシュテーブルを試してみましたか。削除メソッド – 62071072SP

+0

マルチスレッドアプリケーションですか? –

+0

それはマルチスレッドではなく、hashtable.removeメソッドを使用することができますが、私はループを2回繰り返す必要があります。一度削除するキーを見つけてキーコレクションをループして、別々にそれぞれを削除します(私がキーの配列を渡すことができるremoveRangeメソッド – RKP

答えて

0

これは実際にアプリケーションによって異なります。アプリケーションがマルチスレッドで、より前の .NET 4.0の場合は、ReaderWriterLock/ReaderWriterLockSlimを使用してリーダーロックを取得し、削除したいキーのリストを作成してから書き込みロックにアップグレードし、ループを実行する方が良いでしょうキーを削除するには、このようにして、削除するキーをHashtableで繰り返している間に、他のリーダーがロックアウトされずにアクセスできます。

.NET 4.0にアクセスできない場合、ConcurrentDictionaryは素晴らしいですし、競合がはるかに少なくなっています! .NET 2.0にとどまっている場合は、質問自体には含まれていませんが、Dictionaryをお勧めします。

UPDATEアプリケーションがロックするないマルチスレッド、必要ありませんが、()を外し呼び出すと反復する列挙子を無効にしながら、ので、あなたはまだ、キーのリストを構築する必要がある場合。だから、基本的に、あなたは正しく質問にあなたのコメントを与えている。

+0

ありがとう、私はレガシーコードに取り組んでいます。ハッシュテーブルを辞書に変換しなければならないのですか?どのようにしてこの問題を解決するのでしょうか?それはコレクションを操作するためのより良いAPIを持っていますか? – RKP

+0

@RKP:いいえ、マイクロソフトは、一般的なコレクションを常に元のコレクションに優先するよう推奨しています。よりパフォーマンスの高い、非ボクシングなど。しかし、レガシーコードの場合は、あなたが扱っているものを使用するだけです.-) –

0

私が知っている限りではありません。とにかくあなたのリストを反復し、そのようにキーを削除するだけで何が問題なのですか?それを頻繁に行う必要がある場合は、単に関数にしてください。

.NET Framework 3.5以上を使用していた場合、LINQはおそらくあなたの目標をもっと簡単にするでしょう。

+1

残念ながら、LINQはシーケンスに対して変更操作を提供しません(つまり、追加や削除などはありません)。 –

+0

右ですが、要素が(a)条件にのみ一致するシーケンスのコピーを作成することができます。 –

+0

真ではありますが、本質的には削除する一連の結果を残しています。クエリ処理を単純化しますが、1)リストを作成する2)リストからすべてのキーを1つずつ削除します - 同じアルゴリズムです。それが主要なポイントでした。私はLINQクエリがリストを作成するのが簡単だと同意します。 –