Подтвердить что ты не робот

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" из приведенной выше последовательности?

4b9b3361

Ответ 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;