您可以创建自己的扩展方法(不确定“标签”是什么意思)。您还可以创建自己的迭代器。两者可以很好地协同工作。这是一种将窗口函数应用于一个序列的迭代器扩展方法。
public static class SlidingWindowExtensions
{
public static IEnumerable<T> Sliding<T>(this IEnumerable<T> source, Int32 windowSize, Func<IEnumerable<T>, T> function)
{
if (source == null) throw new ArgumentNullException(nameof(source));
if (windowSize <= 0) throw new ArgumentOutOfRangeException(nameof(windowSize), "Must be a positive integer");
if (function== null) throw new ArgumentNullException(nameof(function));
var window = new Queue<T>(source.Take(windowSize - 1));
foreach (var element in source.Skip(windowSize - 1))
{
window.Enqueue(element);
var result = function(window);
window.Dequeue();
yield return result;
}
//Note: does not yield any result if window size is more than the length of the sequence.
// (At least, that way function is guaranteed to get windowSize elements.)
}
}
您的情况是窗口大小为 2 和差分函数的特例。
numb.Sliding(2, w => w.Skip(1).First() - w.First())
功能有点尴尬。这不那么重要,但设置更笨重。
Func<IEnumerable<int>, int> first = w => w.First();
Func<IEnumerable<int>, int> second = w => w.Skip(1).First();
numbs.Sliding(2, w => second(w) - first(w))
更进一步
Func<IEnumerable<int>, int> diff = w => second(w) - first(w);
numbs.Sliding(2, diff)
有点花哨
Func<IEnumerable<int>, IEnumerable<int>> slidingDifference = source => source.Sliding(2, diff);
slidingDifference(numbs)
另一个例子:滑动平均
numbs.Sliding(2, w => (w.Sum() / 2))
但是,请查看LINQ's Standard Query Operators。
Code 为您的LINQPad(强烈推荐)。