经常需要这样的功能:
foreach (Line line in lines)
{
if (line.FullfilsCertainConditions())
{
lines.Remove(line)
}
}
这个方法不起作用,因为我总是会得到一个 InvalidOperationException
错误,提示在循环期间 Enumerator 已经被更改。
所以我将所有这种循环都改成了以下形式:
List<Line> remove = new List<Line>();
foreach (Line line in lines)
{
if (line.FullfilsCertainConditions())
{
remove.Add(line)
}
}
foreach (Line line in remove) {
{
lines.Remove(line);
}
我不确定这是否是最佳方法,因为在最坏的情况下,我必须在原始列表上迭代2次,所以它需要2n的时间而不是n。
有更好的方法吗?
编辑:
我能够使用Mark的答案做到这一点!但是如果我的集合没有实现RemoveAll()怎么办?
例如,一个
System.Windows.Controls.UIElementCollection
编辑2:
再次在Mark的帮助下,我现在可以调用以下内容来删除所有ScatterViewItems:
CollectionUtils.RemoveAll(manager.getWindow().IconDisplay.Items, elem => elem.GetType() == typeof(ScatterViewItem));
lines.Remove(line)
会再次迭代集合。 - Matten