我试图找出是否有可能在lambda表达式函数中有两个输入参数,可以将多个结果放入数组中,而不是像下面那样使用for循环。
int N = 10;
int[] numbs = new int[N] { 3, 5, 6, 7, 8, 11, 15, 17, 28, 55 };
int[] results = new int[N-1];
for (int i=0; i < N-1; i++)
results[i] = numbs[i+1] - numbs[i];
foreach (int i in results)
Console.WriteLine(i);
输出2,1,1,1,3,4,2,11,17
这样的事情:
results = numbs.Select( (x,y) => y-x );
答案 0 :(得分:3)
您可以使用Zip
将数组与自身对齐,移动一个索引:
results = numbs.Zip(numbs.Skip(1), (n1, n2) => n2 - n1)
.ToArray();
答案 1 :(得分:0)
您可以创建自己的扩展方法(不确定您的意思是&#34;标记&#34;)。您还可以创建自己的迭代器。这两者可以很好地协同工作。这是一个迭代器扩展方法,用于将窗口函数应用于一个序列。
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))