我编写了下面的扩展方法,用于查找满足传递给它的谓词的连续项序列。序列中连续项的数量由参数“sequenceSize”确定。
例如,我可能有一个整数的IEnumerable,并且想要找到10个连续的大于100的值。这个扩展方法将确定是否存在这样的序列。
这个方法运行良好。但是,由于它必须执行的操作,如果IEnumerable中有相当数量的元素,它可能会很慢,因为它必须从第一个元素开始,查找满足谓词的连续值,然后转到第二个元素并执行相同的操作等等。
我正在寻求加快速度的建议。我尝试使用AsParallel(),但没有影响。
例如,我可能有一个整数的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);
}
}
All
是否会产生可衡量的影响,我不能确定,但至少它意味着您不会命中序列中的每个元素。如果您有一长串不符合过滤谓词的元素,则可能是一个巨大的优势。 - Paul PhillipsmatchList
本质上是调用谓词在序列的每个成员上的结果的缓存。matchList[i] == predicate(list[i])
- dlev