我在C#中有一个hashset,如果在迭代通过hashset时遇到条件,我将删除它,并且不能使用foreach循环执行此操作,如下所示。
foreach (String hashVal in hashset)
{
if (hashVal == "somestring")
{
hash.Remove("somestring");
}
}
那么,如何在迭代时删除元素?
答案 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)
使用枚举器循环遍历集合时,无法从集合中删除项目。解决这个问题的两种方法是:
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);
}