Я хочу различить методы TakeWhile
& Where
LINQ. Я получил следующие данные из MSDN. Но для меня это не имело смысла.
Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
Фильтрует последовательность значений на основе предиката.
TakeWhile<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
Возвращает элементы из последовательности, пока выполняется указанное условие.
Все мнения приветствуются.
Ответы:
TakeWhile
останавливается, когда условие ложно,Where
продолжается и находит все элементы, соответствующие условиюДает
источник
Where
можно просмотреть всю последовательность в поисках совпадений.TakeWhile
перестает искать, когда встречает первое несовпадение.источник
Скажем, у вас есть массив, содержащий
[1, 3, 5, 7, 9, 0, 2, 4, 6, 8]
. Сейчас:var whereTest = array.Where(i => i <= 5);
вернется[1, 3, 5, 0, 2, 4]
.var whileTest = array.TakeWhile(i => i <= 5);
вернется[1, 3, 5]
.источник
MSDN говорит
Enumerable.TakeWhile Method
Enumerable.Where
Разница в том, что
Enumerable.TakeWhile
остальные элементы из первого несоответствия пропускаются независимо от того, соответствуют они условию или нет.источник
Порядок переданной последовательности абсолютно критичен с
TakeWhile
, который прекратится, как только предикат вернетсяfalse
, тогда какWhere
будет продолжать оценивать последовательность после первогоfalse
значения.Обычное использование для
TakeWhile
во время ленивого вычисления больших, дорогих или даже бесконечных перечислимых элементов, когда у вас могут быть дополнительные сведения об упорядочении последовательности.например, учитывая последовательность:
A
.Where
приведет к бесконечному циклу, пытающемуся оценить часть перечислимого:В то время как a
.TakeWhile
и вооруженный знанием того, что перечислимые восходящие, позволит оценить частичную последовательность:источник
Хотя существующие ответы верны, ни один из них не указывает, почему вы хотели бы использовать TakeWhile, если результаты будут такими же: производительность. Предположим, у вас есть упорядоченный список с 2 миллиардами элементов в нем, и вам нужны те, которые (вероятно, на 10 или 15 элементов) меньше заданного значения. Предложение Where проверит все 2 миллиарда элементов, в то время как TakeWhile остановится, как только найдет значение, равное или превышающее предоставленное вами значение.
источник