【发布时间】:2016-08-09 23:05:08
【问题描述】:
我需要遍历 List<myObject> 并删除满足特定条件的项目。
我看到了这个答案 (https://stackoverflow.com/a/1582317/5077434):
使用 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));
但我知道for的效率不如foreach,
所以我想到了使用后者如下:
foreach (var item in myList.ToList())
{
// if certain condition applies:
myList.Remove(item)
}
一种方法比另一种更好吗?
编辑:
我不想使用RemoveAll(...),因为在条件之前的循环中有大量代码。
【问题讨论】:
-
“更好”是什么?表现?记忆?易读性?
-
for的效率不低于foreach。而不是循环,您可以使用RemoveAll,它具有更好的性能:msdn.microsoft.com/en-us/library/wdka673a%28v=vs.110%29.aspx -
你不能从你在 foreach 中使用的同一个列表中删除项目,你会得到一个异常 (System.InvalidOperationException)。
-
LINQ中没有
RemoveAll()这样的东西。 -
@poke 对于数组,这肯定不是真的,
foreach已高度优化。