C# 在ForEach中添加或从可观察集合中移除

C# 在ForEach中添加或从可观察集合中移除,c#,mvvm,observablecollection,C#,Mvvm,Observablecollection,我认为我无法在下面的foreach循环中修改可观察的集合“variates”-只要满足“if”中的条件,就会发生“Remove”,那么foreach在仍然有大量集合要处理时就存在 我修改了它,如果满足条件而不是从变种中删除,它会将变种添加到一个新列表中,但是一旦第一次满足条件,foreach就会存在 我错过什么了吗 foreach (Variety variety in varieties) { if (variety.Type != main.Type && var

我认为我无法在下面的foreach循环中修改可观察的集合“variates”-只要满足“if”中的条件,就会发生“Remove”,那么foreach在仍然有大量集合要处理时就存在

我修改了它,如果满足条件而不是从变种中删除,它会将变种添加到一个新列表中,但是一旦第一次满足条件,foreach就会存在

我错过什么了吗

foreach (Variety variety in varieties)
 {
     if (variety.Type != main.Type && variety.Type != null)
      {
           varieties.Remove(variety);
       }
 }
更改代码:

foreach (Variety variety in varieties)
 {
     if (variety.Type == main.Type || variety.Type == null)
      {
           FilteredVarieties.Add(variety);
       }
 }

无法在foreach中修改源集合。如果确实要修改,请尝试在foreach中创建一个要循环的副本,并在其中进行修改

 var sourcecopy=varieties;
 foreach (Variety variety in sourcecopy)
 {
 if (variety.Type != main.Type && variety.Type != null)
  {
       varieties.Remove(variety);
   }
 }

无法在
foreach
循环中从集合中删除项目。当您说
foreach
时,实际上是在为创建一个从0到集合原始计数的
循环。因此,一旦删除了某些内容并且集合的计数发生了更改,循环的范围就不会得到更新

如果你切换到一个普通的
循环,你应该会做得很好。

正如其他人(和编译器)可能说过的那样,你不能以这种方式更改正在枚举的集合。但是,如果您在
foreach
定义中
.ToList()
您的集合,您实际上是在枚举列表的副本,因此可以自由删除或添加到原始列表中

foreach(variation中的variation.ToList())
{
if(variation.Type!=main.Type&&variation.Type!=null)
{
品种。去掉(品种);
}
}