gpt4 book ai didi

Linq IEnumerable 扩展方法 - 如何提高性能?

转载 作者:行者123 更新时间:2023-12-04 22:24:22 24 4
gpt4 key购买 nike

我编写了以下扩展方法,用于查找满足传递给它的谓词的 连续 项序列。序列中连续项的数量由参数“sequenceSize”决定。

例如,我可能有一个整数的 IEnumerable,我想找到 10 个大于 100 的连续值。此扩展方法将确定这样的序列是否存在。

这种方法效果很好。但是,由于它必须做的事情,如果 IEnumerable 中有大量元素,它可能会很慢,因为它必须从第一个元素开始,寻找满足谓词的连续值,然后转到第二个元素并执行一样的等等。

我正在寻找有关如何加快速度的建议。我尝试使用 AsParallel() 但这没有影响。

public static IEnumerable<IEnumerable<T>> FindSequenceConsecutive<T>(this IEnumerable<T> sequence, 
Predicate<T> predicate,
int sequenceSize)
{
IEnumerable<T> current = sequence;

while (current.Count() > sequenceSize)
{
IEnumerable<T> window = current.Take(sequenceSize);

if (window.Where(x => predicate(x)).Count() >= sequenceSize)
yield return window;

current = current.Skip(1);
}
}

最佳答案

我相信这个解决方案将提供最好的性能,并且随着序列变大会更好地扩展,因为它不分配任何额外的缓冲区(列表或队列),也不必将结果转换为列表或对结果缓冲区。另外,它只对序列进行一次迭代。

public static IEnumerable<IEnumerable<T>> FindSequenceConsecutive<T>(this IEnumerable<T> sequence,
Predicate<T> predicate, int sequenceSize)
{
IEnumerable<T> window = Enumerable.Repeat(default(T), 0);

int count = 0;

foreach (var item in sequence)
{
if (predicate(item))
{
window = window.Concat(Enumerable.Repeat(item, 1));
count++;

if (count == sequenceSize)
{
yield return window;
window = window.Skip(1);
count--;
}
}
else
{
count = 0;
window = Enumerable.Repeat(default(T), 0);
}
}
}

关于Linq IEnumerable 扩展方法 - 如何提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7196392/

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