我正在寻找一种更好的 模式 来处理元素列表,每个元素都需要处理,然后根据结果从列表中删除。
您不能.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。
.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方法来测试:
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));