LINQ - SkipWhile повреждается?

Я немного удивлен найти результаты следующего кода, где я просто хочу удалить все 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 }

Таким образом,

  • Кроме удаляет эти 3, но также и удаляет неотличные элементы. Grr.
  • SkipWhile не пропускает последний элемент, даже если он соответствует условию. Grr.

Кто-то может объяснить, почему SkipWhile не пропускает последний элемент? И кто-либо может предложить, какой оператор LINQ я могу использовать для удаления '3' из последовательности выше?

27
задан Judah Gabriel Himango 26 March 2010 в 22:02
поделиться

4 ответа

Не сломано. SkipWhile будет пропускать только элементы в начале IEnumerable . Как только это условие не будет выполнено, он с радостью возьмет на себя остальные элементы. Другие элементы, которые позже будут соответствовать ему, не будут пропущены.

int[] sequence = { 3, 3, 1, 1, 2, 3 };
var result = sequence.SkipWhile(i => i == 3); 
// Result: 1, 1, 2, 3
57
ответ дан 28 November 2019 в 04:18
поделиться

Ахмад уже ответил на ваш вопрос, но вот другой вариант:

var result = from i in sequence where i != 3 select i;
1
ответ дан 28 November 2019 в 04:18
поделиться
var result = sequence.Where(i => i != 3);
19
ответ дан 28 November 2019 в 04:18
поделиться

Операторы SkipWhile и TakeWhile пропускают или возвращают элементы из последовательности, пока предикатная функция проходит (возвращает True). Первый элемент, не прошедший предикатную функцию, завершает процесс оценки.

//Пропускает элементы в последовательности, пока заданное условие истинно, и возвращает оставшиеся элементы.

3
ответ дан 28 November 2019 в 04:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: