我正在寻找一个更好的模式来处理一个元素列表,每个元素都需要处理,然后根据结果从列表中删除。
您不能使用 .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
的位置.
有没有一种优雅的方式来做到这一点?
最佳答案
使用 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 method带有要测试的谓词:
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));
关于c# - 如何在迭代时从通用列表中删除元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39008325/