Я немного удивлен найти результаты следующего кода, где я просто хочу удалить все 3 с из последовательности ints:
var sequence = new [] { 1, 1, 2, 3 };
var result = sequence.SkipWhile(i => i == 3); // Oh noes! Returns { 1, 1, 2, 3 }
Почему 3 не пропускается?
Моя следующая мысль была, хорошо, оператор Except добьется цели:
var sequence = new [] { 1, 1, 2, 3 };
var result = sequence.Except(i => i == 3); // Oh noes! Returns { 1, 2 }
Таким образом,
Кто-то может объяснить, почему SkipWhile не пропускает последний элемент? И кто-либо может предложить, какой оператор LINQ я могу использовать для удаления '3' из последовательности выше?
Не сломано. SkipWhile
будет пропускать только элементы в начале IEnumerable
. Как только это условие не будет выполнено, он с радостью возьмет на себя остальные элементы. Другие элементы, которые позже будут соответствовать ему, не будут пропущены.
int[] sequence = { 3, 3, 1, 1, 2, 3 };
var result = sequence.SkipWhile(i => i == 3);
// Result: 1, 1, 2, 3
Ахмад уже ответил на ваш вопрос, но вот другой вариант:
var result = from i in sequence where i != 3 select i;
Операторы SkipWhile и TakeWhile пропускают или возвращают элементы из последовательности, пока предикатная функция проходит (возвращает True). Первый элемент, не прошедший предикатную функцию, завершает процесс оценки.
//Пропускает элементы в последовательности, пока заданное условие истинно, и возвращает оставшиеся элементы.