gpt4 book ai didi

c# - 有没有更好的方法来获取每个项目与谓词匹配的子序列?

转载 作者:太空狗 更新时间:2023-10-30 00:36:52 25 4
gpt4 key购买 nike

假设我有一个 IEnumerable。例如,{2,1,42,0,9,6,5,3,8}。

我需要“运行”与谓词匹配的项目。例如,如果我的谓词是

bool isSmallerThanSix(int number){...}

我想得到以下输出:{{2,1},{0},{5,3}}

是否有内置函数可以完成此操作?

到目前为止我有这个:

public static IEnumerable<IEnumerable<T>> GetSequences<T>(this IEnumerable<T> source,
Func<T, bool> selector) {

if (source == null || selector == null) {
yield break;
}

IEnumerable<T> rest = source.SkipWhile(obj => !selector(obj));

while (rest.Count() > 0) {
yield return rest.TakeWhile(obj => selector(obj));
rest = rest
.SkipWhile(obj => selector(obj))
.SkipWhile(obj => !selector(obj));
}


}

这似乎有效,但我是在半夜写的,因此从星期二开始十五次效率低下。是否有更好的、最好是内置的(因此经过充分测试的)方法?

非常感谢大家的宝贵时间,

里亚。

最佳答案

据我所知,没有内置方法。但是,在 IEnumerable 上调用 Count 扩展方法效率不高,因为它必须枚举列表才能获得计数。因此,我想出了具有相同效果的方法。

public static IEnumerable<IEnumerable<T>> 
GetSequences<T>(this IEnumerable<T> source, Func<T, bool> selector)
{
// omitted null checks for brevity
var list = new List<T>();

foreach(var item in source)
{
if (selector.Invoke(item))
{
list.Add(item);
}
else if (list.Count > 0)
{
yield return list;
list = new List<T>();
}
}

if (list.Count > 0)
yield return list;
}

正如 Jon Skeet 所提到的,在这种情况下,使用 SkipWhileTakeWhile 似乎也非常低效,因为它们将在迭代器上的迭代器上创建迭代器。您可以检查这一点,因为在调试您的示例时它会变得有点疯狂,因为您逐步尝试查找下一个序列等等,即使示例很简单。

关于c# - 有没有更好的方法来获取每个项目与谓词匹配的子序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/568724/

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