30

C#にハッシュセットがあり、ハッシュセットの反復中に条件が満たされた場合に削除しますが、以下のようにforeachループを使用してこれを行うことはできません。

foreach (String hashVal in hashset) 
{
     if (hashVal == "somestring") 
     {
            hash.Remove("somestring");
     }
}

では、反復中に要素を削除するにはどうすればよいですか?

4

5 に答える 5

57

代わりに、HashSetのRemoveWhereメソッドを使用してください。

hashset.RemoveWhere(s => s == "somestring");

メソッドのパラメーターとして条件/述語を指定します。述語に一致するハッシュセット内のアイテムはすべて削除されます。

これにより、繰り返し処理中にハッシュセットを変更する問題が回避されます。


あなたのコメントに応えて:

「s」は、ハッシュセット内から評価されている現在のアイテムを表します。

上記のコードは次と同等です。

hashset.RemoveWhere(delegate(string s) {return s == "somestring";});

また:

hashset.RemoveWhere(ShouldRemove);

public bool ShouldRemove(string s)
{
    return s == "somestring";
}

編集: 何かが私に起こりました:HashSetは重複する値を含まないセットであるため、呼び出すだけでhashset.Remove("somestring")十分です。一致するものが1つしか存在しないため、ループで実行する必要はありません。

于 2009-09-26T21:43:34.023 に答える
10

列挙子を使用してコレクションをループしている間は、コレクションからアイテムを削除することはできません。これを解決するための2つのアプローチは次のとおりです。

  • 通常のインデックス付きforループを使用してコレクションを逆方向にループします(これは、の場合のオプションではないと思いますHashSet
  • コレクションをループし、削除するアイテムを別のコレクションに追加してから、「削除する」コレクションをループして、アイテムを削除します。

2番目のアプローチの例:

HashSet<string> hashSet = new HashSet<string>();
hashSet.Add("one");
hashSet.Add("two");

List<string> itemsToRemove = new List<string>();
foreach (var item in hashSet)
{
    if (item == "one")
    {
        itemsToRemove.Add(item);
    }
}

foreach (var item in itemsToRemove)
{
    hashSet.Remove(item);
}
于 2009-09-26T21:44:07.873 に答える
8

2 つの foreach ループを使用することは避けます。1 つの foreach ループで十分です。

HashSet<string> anotherHashSet = new HashSet<string>();
foreach (var item in hashSet)
{
    if (!shouldBeRemoved)
    {
        anotherSet.Add(item);
    }
}
hashSet = anotherHashSet;
于 2011-07-20T22:56:57.707 に答える
0

通常、何かを繰り返し処理して、使用する値を削除したい場合は、次のようにします。

 For (index = last to first)
      If(ShouldRemove(index)) Then
           Remove(index)
于 2009-09-26T21:40:23.757 に答える