Очень часто мне нужно что-то вроде этого:
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.
Есть ли лучший способ сделать это?
EDIT:
Я смог сделать это, используя ответ Mark! Но что, если моя коллекция не реализует RemoveAll()?
Например, <
System.Windows.Controls.UIElementCollection
ИЗМЕНИТЬ 2:
Снова с помощью Mark я теперь могу сделать следующий вызов, чтобы удалить все ScatterViewItems:
CollectionUtils.RemoveAll(manager.getWindow().IconDisplay.Items, elem => elem.GetType() == typeof(ScatterViewItem));