一尘不染

迭代时如何从通用列表中删除元素?

c#

我正在寻找一种更好的 模式 来处理元素列表,每个元素都需要处理,然后根据结果从列表中删除。

您不能.Remove(element)在内部使用foreach (var element in X)(因为它会导致Collection was modified; enumeration operation may not execute.异常)…您也不能使用for (int i = 0; i < elements.Count(); i++).RemoveAt(i)因为这会干扰您相对于的当前位置i

有没有一种优雅的方法可以做到这一点?


阅读 325

收藏
2020-05-19

共1个答案

一尘不染

用for循环反向遍历您的列表:

for (int i = safePendingList.Count - 1; i >= 0; i--)
{
    // some code
    // safePendingList.RemoveAt(i);
}

例:

var list = new List<int>(Enumerable.Range(1, 10));
for (int i = list.Count - 1; i >= 0; i--)
{
    if (list[i] > 5)
        list.RemoveAt(i);
}
list.ForEach(i => Console.WriteLine(i));

或者,您可以使用带有谓词的RemoveAll方法来测试:

safePendingList.RemoveAll(item => item.Value == someValue);

这是一个简化的示例来演示:

var list = new List<int>(Enumerable.Range(1, 10));
Console.WriteLine("Before:");
list.ForEach(i => Console.WriteLine(i));
list.RemoveAll(i => i > 5);
Console.WriteLine("After:");
list.ForEach(i => Console.WriteLine(i));
2020-05-19