Пользовательский Содержащий TakeWhile (), там лучший путь?

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

Сообщество может предоставить немного некоторые подсказки или переписывает?:)

5
задан Alastair Pitts 23 June 2010 в 03:00
поделиться

1 ответ

Вы правы; это не подходит для отложенного выполнения (вызов 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;
        }
    }
} 
14
ответ дан 18 December 2019 в 13:11
поделиться
Другие вопросы по тегам:

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