我正在使用一个HashSet,以避免在我的集合内具有相同值的两个(或更多)项,在我的工作中,我需要迭代我的HashSet并删除其值,但不幸的是我不能这样做,我要做的是:
string newValue = "";
HashSet<string> myHashSet;
myHashSet = GetAllValues(); // lets say there is a function which fill the hashset
foreach (string s in myHashSet)
{
newValue = func(s) // lets say that func on some cases returns s as it was and
if(s != newValue) // for some cases returns another va
{
myHashSet.Remove(s);
myHashSet.Add(newValue);
}
}
提前感谢您的帮助
不能在容器被迭代时修改它。解决方案是使用LINQ (Enumerable.Select
)将初始集合投影到一个"修改"的集合中,并根据投影结果创建一个新的HashSet
。
因为如果有一个具有适当签名的func
,您可以直接将其粘贴到Enumerable.Select
方法中,并且因为HashSet
有一个接受IEnumerable<T>
的构造函数,所以这一切都归结为一行:
var modifiedHashSet = new HashSet(myHashSet.Select(func));
接受的答案确实是正确的,但是,如果需要修改同一实例的,则可以遍历HashSet
的副本。
foreach (string s in myHashSet.ToArray()) // ToArray will create a copy
{
newValue = func(s)
if(s != newValue)
{
myHashSet.Remove(s);
myHashSet.Add(newValue);
}
}