具有2个参数和多个结果输出的lambda表达式

时间:2016-07-16 15:39:02

标签: c# methods lambda extension-methods

我试图找出是否有可能在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 );

2 个答案:

答案 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))

但是,请查看LINQ's Standard Query Operators

Code代表LINQPad(强烈推荐)。