如何从循环中的Enumerable集合中删除对象

joh*_*hnc 13 .net ienumerable design-patterns

重复

通过迭代修改集合


有没有一个很好的模式允许我绕过无法删除对象,而我循环通过一个可枚举的集合(例如,字典中的IList或KeyValuePairs)

例如,以下操作失败,因为它修改了在foreach期间枚举的List

foreach (MyObject myObject in MyListOfMyObjects)
{
     if (condition) MyListOfMyObjects.Remove(myObject);
}
Run Code Online (Sandbox Code Playgroud)

在过去,我使用了两种方法.

我已经用反向for循环替换了foreach(以便在我删除对象时不更改我循环的任何索引).

我还尝试存储一个新的对象集合,以便在循环中移除,然后循环遍历该集合并从原始集合中删除对象.

这些工作正常,但感觉不好,我想知道是否有人提出了更优雅的解决方案

Chr*_*isW 13

List<T>.RemoveAll(Predicate<T> match)我认为有一个有用的方法是为此设计的:http://msdn.microsoft.com/en-us/library/wdka673a.aspx


Mar*_*ham 7

它有点简单,但当我计划从IEnumerable/IList中删除项目时,我通常只是复制一下:

foreach (MyObject myObject in new List<MyObject>(MyListOfMyObjects))
{
     if (condition) MyListOfMyObjects.Remove(myObject);
}
Run Code Online (Sandbox Code Playgroud)

这不是最有效的方法,但它很容易阅读.过早优化和所有这些.