@ smaclell спросил, почему обратная итерация была более эффективной в комментарии к @ sambo99.
Иногда это более эффективно. Предположим, у вас есть список людей, и вы хотите удалить или отфильтровать всех клиентов с кредитным рейтингом <1000; </p>
У нас есть следующие данные
"Bob" 999
"Mary" 999
"Ted" 1000
Если бы мы перешли вперед, у нас скоро бы возникли проблемы
for( int idx = 0; idx < list.Count ; idx++ )
{
if( list[idx].Rating < 1000 )
{
list.RemoveAt(idx); // whoops!
}
}
При idx = 0 мы удаляем Bob
, который затем сдвигает все оставшиеся элементы влево. В следующий раз через цикл idx = 1, но
список [1] теперь Ted
вместо Mary
. В итоге мы пропускаем Mary
по ошибке. Мы могли бы использовать цикл while и ввести больше переменных.
Или мы просто изменим итерацию:
for (int idx = list.Count-1; idx >= 0; idx--)
{
if (list[idx].Rating < 1000)
{
list.RemoveAt(idx);
}
}
Все индексы слева от удаленного элемента остаются прежними, поэтому вы не пропустите ни одного элемента.
Тот же принцип применяется, если вам дан список индексов для удаления из массива. Чтобы не усложнять ситуацию, вам нужно отсортировать список, а затем удалить элементы с наивысшего индекса на наименьший.
Теперь вы можете просто использовать Linq и прямо заявить о том, что вы делаете.
list.RemoveAll(o => o.Rating < 1000);
В этом случае удаления отдельного элемента не будет более эффективной итерации вперед или назад. Вы также можете использовать Linq для этого.
int removeIndex = list.FindIndex(o => o.Name == "Ted");
if( removeIndex != -1 )
{
list.RemoveAt(removeIndex);
}