LINQ - отключен SkipWhile?
Я немного удивлен, увидев результаты следующего кода, где я просто хочу удалить все 3s из последовательности 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 }
Таким образом,
- Кроме удаления 3, но также
удаляет нечеткие элементы. Grr.
- SkipWhile не пропускает последние
элемент, даже если он соответствует
состояние. Grr.
Может кто-нибудь объяснить, почему SkipWhile не пропускает последний элемент? И может ли кто-нибудь предложить, какой оператор LINQ я могу использовать для удаления "3" из приведенной выше последовательности?
Ответы
Ответ 1
Это не сломано. SkipWhile
будет пропускать элементы только в начале IEnumerable<T>
. Как только это условие не будет выполнено, оно с радостью примет остальные элементы. Другие элементы, которые позже будут соответствовать ему по дороге, не будут пропущены.
int[] sequence = { 3, 3, 1, 1, 2, 3 };
var result = sequence.SkipWhile(i => i == 3);
// Result: 1, 1, 2, 3
Ответ 2
var result = sequence.Where(i => i != 3);
Ответ 3
Операторы SkipWhile и TakeWhile пропускают или возвращают элементы из последовательности, когда предикатная функция проходит (возвращает True). Первый элемент, который не передает функцию предиката, заканчивает процесс оценки.
//Обходит элементы в последовательности, пока указанное условие истинно и возвращает остальные элементы.
Ответ 4
Одним из решений, которые могут оказаться полезными, является функция List "FindAll".
List <int> aggregator = new List<int> { 1, 2, 3, 3, 3, 4 };
List<int> result = aggregator.FindAll(b => b != 3);
Ответ 5
Ахмад уже ответил на ваш вопрос, но вот еще один вариант:
var result = from i in sequence where i != 3 select i;