Lambda表达式常用语法

时间:2009-10-12 05:11:08

标签: c# lambda

我可以遵循任何简单的synax或规则来在C#中构建“lambda表达式”吗?我阅读了一些文章并理解lambda表达式是什么,但是如果我有一般语法或规则会有所帮助。

2 个答案:

答案 0 :(得分:10)

根据具体情况,有多种表达lambda的方法 - 一些例子:

    // simplest form; no types, no brackets
    Func<int, int> f1 = x => 2 * x;
    // optional exlicit argument brackets
    Func<int, int> f2 = (x) => 2 * x;
    // optional type specification when used with brackets
    Func<int, int> f3 = (int x) => 2 * x;
    // multiple arguments require brackets (types optional)
    Func<int, int, int> f4 = (x, y) => x * y;
    // multiple argument with explicit types
    Func<int, int, int> f5 = (int x, int y) => x * y;

lambda的签名必须与所使用的委托的签名相匹配(无论是明确的,如上所述,还是由.Select(cust => cust.Name)

等内容隐含的

通过使用空表达式列表,您可以使用不带参数的lambdas

    // no arguments
    Func<int> f0 = () => 12;

理想情况下,右侧的表达正是如此;一个表达式。编译器可以将其转换为 delegate Expression树:

    // expression tree
    Expression<Func<int, int, int>> f6 = (x, y) => x * y;

然而;您也可以使用语句块,但这只能用作delegate

    // braces for a statement body
    Func<int, int, int> f7 = (x, y) => {
        int z = x * y;
        Console.WriteLine(z);
        return z;
    };

请注意,即使.NET 4.0 Expression树支持语句体,C#4.0编译器也不会为您执行此操作,因此您仍然只能使用简单{{1树木,除非你这样做“艰难的”;有关详细信息,请参阅my article on InfoQ

答案 1 :(得分:8)

从根本上说,lambda表达式是函数指针的简写符号。更常见的是,lambda表达式是将输入数据传播到计算结果的表达式中。在大多数情况下,您将以更常见的形式使用lambda表达式:

int[] numbers = new[] { 1, 3, 11, 21, 9, 23, 7, 4, 18, 7, 7, 3, 21 };

var twentyoneCount = numbers.Where(n => n == 21).Count();
var sumOfgreaterThanSeven = numbers.Sum(n => n > 7 ? n : 0);

在不太常见的形式中,lambda表达式可以替换更繁琐的委托形式:

myButton.Click += new EventHandler(myButton_Click);
// ...
void myButton_Click(object sender, EventArgs e)
{
    // TODO: Implement button click handler here
}

或者不那么常见,而且不那么冗长:

myButton.Click += delegate(object sender, EventArgs e)
{
    // TODO: Implement button click handler here
};

以下lambda表达式与上面两个表达式相同:

myButton.Click += (s,e) =>
{
    // TODO: Implement button click handler here
};

后一种形式的力量确实来自它创造封闭的能力。闭包是在函数中实现函数,并在父函数范围内“关闭”参数和变量:

private void DoSomething(IList<string> input, SomeObject source)
{
    source.OnSomeEvent += (s,e) => return input.Sum();
}