在C#中删除项目时重置HashSet

时间:2009-09-26 21:34:11

标签: c# hashset

我在C#中有一个hashset,如果在迭代通过hashset时遇到条件,我将删除它,并且不能使用foreach循环执行此操作,如下所示。

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

那么,如何在迭代时删除元素?

5 个答案:

答案 0 :(得分:47)

使用HashSet的RemoveWhere方法:

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

指定条件/谓词作为方法的参数。将删除散列集中与谓词匹配的任何项目。

这避免了在重复迭代时修改hashset的问题。


回应你的评论:

's'表示从hashset中计算的当前项目。

以上代码相当于:

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

或:

hashset.RemoveWhere(ShouldRemove);

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

修改 我刚刚发生了一些事情:因为HashSet是一个不包含重复值的集合,所以只需调用hashset.Remove("somestring")即可。没有必要在循环中执行它,因为永远不会有多个匹配。

答案 1 :(得分:8)

使用枚举器循环遍历集合时,无法从集合中删除项目。解决这个问题的两种方法是:

  • 使用常规的索引for循环向后循环集合(我认为HashSet不是一个选项)
  • 循环集合,将要删除的项目添加到另一个集合,然后循环“待删除”集合并删除项目:

第二种方法的例子:

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);
}

答案 2 :(得分:5)

我会避免使用两个foreach循环 - 一个foreach循环就足够了:

HashSet<string> anotherHashSet = new HashSet<string>();
foreach (var item in hashSet)
{
    if (!shouldBeRemoved)
    {
        anotherSet.Add(item);
    }
}
hashSet = anotherHashSet;

答案 3 :(得分:0)

通常当我想迭代某些内容并删除我使用的值时:

 For (index = last to first)
      If(ShouldRemove(index)) Then
           Remove(index)

答案 4 :(得分:0)

对于那些正在寻找一种在删除它们的同时处理 HashSet 中元素的方法的人,我是按照以下方式进行的

var set = new HashSet<int> {1, 2, 3};

while (set.Count > 0)
{
  var element = set.FirstOrDefault();
  Process(element);
  set.Remove(element);
}