2017-06-09 67 views
0

从可观察的集合中移除,我不认为我可以在下面的foreach循环修改观察集合“品种” - 每当然后在“如果”满足“删除”的情况发生在foreach存在的时候,它仍然有大量的收藏需要通过。添加或内的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); 
     } 
} 

回答

0

不能修改源收集的foreach内。如果你真的想修改,可以尝试让一个副本在foreach中循环并在里面修改它。

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

您无法从foreach循环中删除收藏夹中的物品。当你说foreach时发生了什么事情是否真的创建了一个for循环,该循环从0到该集合的原始计数。所以一旦你删除了一些东西并且集合的数量发生变化,循环的范围就不会被更新。

如果切换到正常for循环,你应该是好的,但。

0

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

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