这里最简单的做法是调用coins.RemoveAll(coin => coin.delete);
. (谷歌List.RemoveAll
)。这会给您留下一个硬币列表,在一个语句中删除了所有“删除”,无需担心计数器或循环变量或临时副本或其他任何东西。因此,您可以随心所欲地迭代剩余的硬币。
coins.RemoveAll(coin => coin.delete);
foreach (var coin in coins)
coin.somethingElse();
如果您需要一个只遍历列表一次的更快的实现,这就是您所需要的。不要在循环中Remove
或RemoveAt
循环中使用任何解决方案,因为这些操作很慢,因此在循环中使用它们会降低性能。下面只会将每个“好”硬币向下移动到该index
位置然后递增index
,因此任何时候所有“好”硬币都在下方index
。最后你把上面所有的硬币都拿掉了index
,所以你只剩下“好”的硬币了。由于它只迭代一次,它比RemoveAll
选项快大约 2 倍,并且比任何解决方案或循环中的方法都要快。Remove
RemoveAt
var index = 0;
for (var i = 0; i < coins.Count; ++i)
{
var coin = coins[i];
if (!coin.delete)
{
coin.somethingElse();
coins[index++] = coin;
}
}
coins.RemoveRange(index, coins.Count - index);