在执行foreach时,从c#中的List <T>中删除元素的最高效方法是什么?

gur*_*gui 0 c#

我想知道在执行foreach时从c#中删除List中元素的最佳方法是什么.

这是一个代码示例.首先,我创建一个包含一些元素的列表,然后删除一个:

List<int> foo = new List<int>();
foo.Add(1);
foo.Add(2);
foo.Add(3);
foreach (int i in foo)
{
    if (i==2)
    {
        foo.Remove(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行这个,我得到一个InvalidOperationException但如何以高效的方式解决这个问题?

das*_*ght 12

如果必须在枚举时删除条目,请向后移动列表,并删除需要删除的项目.

for (var i = foo.Count-1 ; i >= 0 ; i--) {
    if (MustBeRemoved(foo[i])) {
        foo.RemoveAt(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这是不是在您的文章,您知道需要删除的值的情况下需要.


Sco*_*iAS 9

foo.RemoveAll(x => x == 2);
Run Code Online (Sandbox Code Playgroud)

如果您决定不使用和foreach;)


Ant*_*ram 7

我假设你的实际用例比你的用例更复杂.因此,让我们假设您实际上有一些适用于每个元素的条件,并且多个元素可以满足.我们称之为谓词.

List<T>公开一种RemoveAll允许您提供谓词的方法.然后删除与该谓词匹配的任何项.例如

Func<int, bool> isEven = i => i % 2 == 0;
List<int> ints = ...
ints.RemoveAll(item => isEven(item));
// ints will only contain odd numbers 
Run Code Online (Sandbox Code Playgroud)

其他需要考虑的方法是在for循环中向后遍历列表并按索引删除,构建包含要删除的项目的第二个列表,然后在第二个列表中的第二个循环,从第一个列表中删除项目.或者您可以编写一个查询来构造一个包含您希望保留的项目的序列.