Порядок переданной последовательности абсолютно критичен с TakeWhile, который прекратится, как только предикат вернется false, тогда какWhere будет продолжать оценивать последовательность после первого falseзначения.
Обычное использование для TakeWhile во время ленивого вычисления больших, дорогих или даже бесконечных перечислимых элементов, когда у вас могут быть дополнительные сведения об упорядочении последовательности.
например, учитывая последовательность:
IEnumerable<BigInteger> InfiniteSequence()
{
BigInteger sequence = 0;
while (true)
{
yield return sequence++;
}
}
A .Whereприведет к бесконечному циклу, пытающемуся оценить часть перечислимого:
var result = InfiniteSequence()
.Where(n => n < 100)
.Count();
В то время как a .TakeWhileи вооруженный знанием того, что перечислимые восходящие, позволит оценить частичную последовательность:
var result = InfiniteSequence()
.TakeWhile(n => n < 100)
.Count();