C# 枚举期间可能删除元素时枚举集合的最佳方法

C# 枚举期间可能删除元素时枚举集合的最佳方法,c#,.net,collections,enumeration,C#,.net,Collections,Enumeration,为了简单起见,有一些类对象的典型集合,例如string IList<string> collection = new List<string>(); 无论如何,这会导致例外。 在枚举过程中循环遍历所有能够删除它的元素的最佳方法是什么?如果集合是列表或集合,您可以使用索引的for循环并执行删除。执行索引的for循环,但要向后执行,因为当您删除成员时,索引会发生更改 e、 g,对于字符串集合示例: for (int i = collection.Count() - 1; i

为了简单起见,有一些类对象的典型集合,例如
string

IList<string> collection = new List<string>();
无论如何,这会导致例外。
在枚举过程中循环遍历所有能够删除它的元素的最佳方法是什么?

如果集合是
列表或
集合
,您可以使用索引的
for
循环并执行删除。

执行索引的for循环,但要向后执行,因为当您删除成员时,索引会发生更改

e、 g,对于字符串集合示例:

for (int i = collection.Count() - 1; i >= 0; i--)
{
    // do some other stuff, then ...

    if (collection[i] == "failed")
        collection.RemoveAt(i);
}
注意:如果使用forward for循环,它一开始可能会正常工作,但每次删除后都会跳过一项(因为删除后索引会重新编号)。因此,该缺陷的一个常见症状是,在得到两个相邻的错误之前,删除似乎是有效的。这可能是一个相当令人困惑的错误。我从来没有遇到过这种情况*cough*

对于列表集合,您可以使用RemoveAll

collection.RemoveAll ( item => item == "failed" );
对于通用IEnumerable集合,您可以创建一个新集合并删除项

var newList = collection.Where ( item => item != "failed" );

由于它是延迟计算的,所以实际上并不是在内存中创建两个集合,而是一个状态机,它将根据需要枚举非失败项。

该代码给出wierd结果:List collection=new List();集合。添加(“一”);集合。添加(“第二”);集合。添加(“第三”);对于C#中的(inti=0;i集合。移除(i)
集合。移除(集合[i])
而不是
集合。移除(i)
?@roviuser是的,谢谢这可能比循环更好。我们事先不知道集合中的类对象是否失败。对集合中的每个项都进行了一些处理,如果操作失败,则将其删除。
var newList = collection.Where ( item => item != "failed" );