gpt4 book ai didi

c# - 自定义包含TakeWhile(),有没有更好的办法?

转载 作者:太空狗 更新时间:2023-10-30 00:09:08 24 4
gpt4 key购买 nike

我编写了一个自定义 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;
}
}
}

关于c# - 自定义包含TakeWhile(),有没有更好的办法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3098649/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com