Просто чтобы дать еще одну возможность, вы можете включить всю логику в оператор Where
и вообще избежать цикла.Это использует тот факт, что назначение возвращает результат назначения, что позволяет нам одновременно установить переменную removeNext
и обеспечить включение нескольких элементов "some text"
, даже если они соседствуют друг с другом в коллекции.
Обратите внимание, что эта идея скорее для забавы, чем для реального кода, так как ее трудно прочитать и она будет подвержена ошибкам, если кто-то попытается обновить ее:
bool removeNext = false;
var myList = collection.Where(i =>
!(i.ToUpper().Contains("TEXT IN UPPER") || i.Contains("some other text")) &&
(!removeNext | (removeNext = i.Contains("some text"))));
Пояснение
Условие перед &&
удаляет весь текст, который нам определенно не важен.По сути, это был мой комментарий к вашему первоначальному вопросу (и это было бы хорошим решением для предварительной фильтрации ваших результатов).Вторая часть &&
гласит:
"Выберите элемент, если removeNext
равно false
ИЛИ, если результат присваивания removeNext = i.Contains("some text")
равен true
"
Ключ |
здесь ключевой, потому что даже если removeNext
равен false
, мы все равно хотим выполнить назначение во второй части.
Мы не используем ||
оператор, потому что это оператор короткого замыкания , означающий, что если первая часть вернет true
, то не будет необходимости оценивать вторую часть (обычно мы хотим эту оптимизацию), и значение removeNext
никогда не изменится.