Я записал пользовательский дополнительный метод LINQ, который расширяется TakeWhile()
метод, чтобы быть содержащим, а не эксклюзивным, когда предикат является ложью.
public static IEnumerable<T> TakeWhile<T>(this IEnumerable<T> source, Func<T, bool> predicate, bool inclusive)
{
source.ThrowIfNull("source");
predicate.ThrowIfNull("predicate");
if (!inclusive)
return source.TakeWhile(predicate);
var totalCount = source.Count();
var count = source.TakeWhile(predicate).Count();
if (count == totalCount)
return source;
else
return source.Take(count + 1);
}
В то время как это работает, я уверен, что существует лучший способ сделать его. Я абсолютно уверен, что это не работает с точки зрения задержанного выполнения/загрузки.
ThrowIfNull()
дополнительный метод для ArgumentNullException
проверка
Сообщество может предоставить немного некоторые подсказки или переписывает?:)
Вы правы; это не подходит для отложенного выполнения (вызов Count
требует полного перечисления источника).
Однако вы можете сделать это:
public static IEnumerable<T> TakeWhile<T>(this IEnumerable<T> source, Func<T, bool> predicate, bool inclusive)
{
foreach(T item in source)
{
if(predicate(item))
{
yield return item;
}
else
{
if(inclusive) yield return item;
yield break;
}
}
}