在迭代HashSet时更改项的值

  • 本文关键字:迭代 HashSet c# hashset
  • 更新时间 :
  • 英文 :


我正在使用一个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);
   }
}

相关内容

  • 没有找到相关文章