2012-05-27 80 views
2

我想删除有Tag集中的所有项目串Dynamic如何从ItemsCollection中删除项目标签是什么?

foreach (MenuItem item in Items.Cast<object>().Where(mi => mi is MenuItem && ((MenuItem) mi).Tag == "Dynamic")) 
{ 
    Items.Remove(item); 
} 

不幸的是,它不会让我删除项目在迭代集合。

是否有一种简单的方法可以删除所有符合条件的项目,在这种情况下Tag设置为字符串Dynamic

回答

4

正如你不能改变一个集合,而迭代它,你将不得不存储结果的项目,并在第二个步骤将其删除。

IList<MenuItem> itemsToRemove = Items.Cast<object>().Where(mi => mi is MenuItem && ((MenuItem) mi).Tag == "Dynamic").ToList(); 
foreach (MenuItem item in itemsToRemove) 
{ 
    Items.Remove(item); 
} 
+0

“收集已修改,枚举操作可能无法执行。” – Tower

+0

编辑该帖子。使用ToList()生成要删除的项目的新实例。它现在会工作。 – MatthiasG

3

您可以使用的方法,而不是List<T>.RemoveAll(Predicate<T> match),像这样:

Items.Cast<object>() 
    .RemoveAll(mi => mi is MenuItem && ((MenuItem) mi).Tag == "Dynamic"); 
+0

猜测'RemoveAll'是一种外部扩展方法吗?听起来很有趣。 – MatthiasG

+0

@MahmoudGamal我该如何使用这种方法?它说它找不到它,即使我添加了'使用System.Collections.Generic'。 – Tower

+0

@rFactor我也想知道。扩展方法RemoveAll仅存在于列表类中,也许您正在使用另一个集合。 – MatthiasG

相关问题