LINQ - SkipWhile сломан? - PullRequest
27 голосов
/ 27 марта 2010

Я немного удивлен, обнаружив результаты следующего кода, где я просто хочу удалить все 3 из последовательности целых чисел:

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

Ответы [ 5 ]

57 голосов
/ 27 марта 2010

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

int[] sequence = { 3, 3, 1, 1, 2, 3 };
var result = sequence.SkipWhile(i => i == 3); 
// Result: 1, 1, 2, 3
19 голосов
/ 27 марта 2010
var result = sequence.Where(i => i != 3);
3 голосов
/ 09 августа 2010

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

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

2 голосов
/ 28 июня 2016

Одним из решений, которое вы можете найти полезным, является использование функции List "FindAll".

List <int> aggregator = new List<int> { 1, 2, 3, 3, 3, 4 };
List<int> result = aggregator.FindAll(b => b != 3);
1 голос
/ 27 марта 2010

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

var result = from i in sequence where i != 3 select i;
...