Выберите элементы сделать хотите вместо того, чтобы удалить элементы вы не хочет. Это намного проще (и, как правило, более эффективно), чем удаление элементов.
var newSequence = (from el in list
where el.Something || el.AnotherThing < 0
select el);
Я хотел отправить это как комментарий в ответ на комментарий оставил Майкл Диллон ниже, но это слишком долго, и, вероятно, полезно иметь в своем ответе так или иначе:
Лично я бы никогда удалите элементы по одному, если вам нужно удалить, затем вызовите RemoveAll
, который берет предикат и только один раз перестраивает внутренний массив, тогда как Remove
выполняет операцию Array.Copy
для каждого элемента, который вы удаляете. RemoveAll
значительно эффективнее.
И когда вы назад итерацию по списку, у вас уже есть индекс элемента, который вы хотите удалить, так что было бы гораздо эффективнее назвать RemoveAt
, потому что Remove
первый делает обход списка, чтобы найти индекс элемента, который вы пытаетесь удалить, но вы уже знаете этот индекс.
В общем, я не вижу причин когда-либо звонить Remove
в цикле. И в идеале, если это вообще возможно, используйте приведенный выше код для потоковой передачи элементов из списка по мере необходимости, чтобы вторая структура данных не создавалась вообще.
Для тех, кто приходит с Java, список C# похож на ArrayList, поскольку вставка/удаление - это O (n), а поиск по индексу - O (1). Это * не * традиционный связанный список. Кажется, немного неудачный C# использует слово «Список» для описания этой структуры данных, так как это напоминает классический связанный список. –
Ничто в названии 'List' не говорит 'LinkedList'. Люди, пришедшие с других языков, кроме Java, могут быть сбиты с толку, когда это будет связанный список. – GolezTrol
Я оказался здесь через поиск vb.net, поэтому, если кто-то хочет эквивалентный синтаксис vb.net для RemoveAll: 'list.RemoveAll (Function (item) item.Value = somevalue)' – pseudocoder