@smaclell запитав, чому зворотна ітерація була більш ефективною в коментарі @ sambo99.
Іноді це ефективніше. Вважайте, що у вас є список людей, і ви хочете видалити або відфільтрувати всіх клієнтів з кредитним рейтингом <1000;
Ми маємо такі дані
"Bob" 999
"Mary" 999
"Ted" 1000
Якби ми хотіли повторити вперед, то незабаром потрапимо в біду
for( int idx = 0; idx < list.Count ; idx++ )
{
if( list[idx].Rating < 1000 )
{
list.RemoveAt(idx);
}
}
При 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);
}