Хотя принятый ответ является отличным ответом на первоначальный вопрос, ответ Цикады предлагает альтернативный подход.
С CLR 4 (VS 2010) мы получаем еще один подход, который имеет дополнительное преимущество, заключающееся в выполнении предиката только один раз для каждого элемента (и делает удобным, чтобы избежать написания предиката дважды в нашем коде).
Предположим, у вас есть IEnumerable<string>
:
IEnumerable<string> myList = new[] {"apples", "bananas", "pears", "tomatoes"};
Вам нужно разделить его на два списка в зависимости от того, соответствуют ли предметы некоторым критериям:
var divided = myList.ToLookup(i => i.Length > 6);
Возвращенный объект чем-то напоминает Dictionary
списков. Предположим, вы хотите оставить те, которые отвечают критериям:
myList = divided[true];
И вы можете использовать знакомый императивный цикл для работы с другими элементами:
foreach (var item in divided[false])
Console.WriteLine("Removed " + item);
Обратите внимание, что нет необходимости использовать List<T>
специально. Мы никогда не модифицируем существующий список - мы просто создаем новые.