C#如何使用Continuation传递样式和Aggregate

时间:2015-09-20 04:43:29

标签: c#

示例1:

void Main()
{
    var seq = new int[] {-4,-3,0,1,2,3,4,};
    var res = seq.Aggregate(0, (a,s) => s >= 0? a+1 : a-1);
}

任何人都可以解释0, (a,s)=> s >= 0是什么? a + 1:a-1表示Aggregate()

示例2:

void Main()
{
    Func<int,int> H = null;
    H = n=> n<=1 ? 1 : 2*H(n-1)+1;
    int x = H(3) + H(5);
}

n =&gt; n&lt; = 1?1:2 * H(n-1)+1是什么意思?为什么有一个&#34; =&gt;&#34;在左边和一个&#34;&lt; =&#34;在n的右边?什么&#34;:&#34;符号的意思?什么是&#34;?&#34;马克意味着什么?

2 个答案:

答案 0 :(得分:3)

seq.Aggregate(0,(a,s)=>s>=0?a+1:a-1);中,第一个参数(0)是种子值。第二个参数是lambda表达式,它指定将为序列中的每个元素运行的委托(方法)。方法Aggregate将从种子(在本例中为0)开始,并将从处​​理序列中的每个元素获得的结果添加到其中。这是一个更长的等效形式,可以让您更好地了解正在发生的事情:

static void Main(string[] args)
{
    var seq = new int[] { -4, -3, 0, 1, 2, 3, 4, };
    var res = seq.Aggregate(0, (a, s) => Calculate(a, s));
}

private static int Calculate(int a, int s)
{
    int returnValue = s >= 0 ? a + 1 : a - 1;
    return returnValue;
}

我建议你在代码中放置断点(在样本的代码中或在我的第二个更详细的形式中)以更好地弄清楚发生了什么。

在第二个示例中,Func<int,int>是委托类型。在线
Func<int, int> H = null;
您声明一个变量H,它是一个方法委托类型,它接受一个int输入参数并返回一个int结果。在下一行:
H = n => n <= 1 ? 1 : 2 * H(n - 1) + 1;
您正在为H分配一个lambda表达式(实际上您将委托方法分配给H)。在下一行:
int x = H(3) + H(5);
你给x分配了一个两次调用H的表达式。请参阅下面的更详细的等效表格,可以更好地解释发生了什么 注意,H的这种特定实现是递归方法。这个方面也更容易以更详细的形式看到。请注意,方法Calculate会调用自己:

private static void Main(string[] args)
{
    Func<int, int> H = null;
    H = Calculate;    // Note that Calculate is not invoked here yet

    int x = H(3) + H(5);
}

private static int Calculate(int input)
{
    int output = input <= 1 ? 1 : 2 * Calculate(input - 1) + 1;
    return output;
}

private static int Calculate(int input)
{
    if (input <= 1)
    {
        return 1;
    }
    else
    {
        return 2 * Calculate(input - 1) + 1;
    }
}

答案 1 :(得分:1)

0之和开始,遍历seq,并在每个元素上调用(a, s) => s == 0 ? a + 1 : a - 1,将调用结果添加到总和中。因此,第一个调用会将第一个元素的值+ 1添加到总和中,而所有其他调用都会将元素的值 - 1添加到总和中。

至于其他问题,请查看lambda表达式和三元语句。