C#lambda表达式可以有多个语句吗?


131

C#lambda表达式可以包含多个语句吗?

(编辑:如以下几个答案中所提及,此问题最初询问的是“行”而不是“语句”。)


17
是的,您可以使用多行。我觉得做一个完整的答案不对。
Tesserex 2011年

1
@Tesserex-是什么让它没有答案...您是对的!
RQDQ 2011年

3
@RQDQ因为这是一个是或否的问题,我认为它不值得通过投票产生的代表。
Tesserex 2011年

Answers:


195

当然:

List<String> items = new List<string>();

var results = items.Where(i => 
            {
                bool result;

                if (i == "THIS")
                    result = true;
                else if (i == "THAT")
                    result = true;
                else
                    result = false;

                return result;
            }
        );

31

(我假设您实际上是在谈论多个语句,而不是多行。)

您可以在带有括号的lambda表达式中使用多个语句,但是只有不使用括号的语法才能转换为表达式树:

// Valid
Func<int, int> a = x => x + 1;
Func<int, int> b = x => { return x + 1; };        
Expression<Func<int, int>> c = x => x + 1;

// Invalid
Expression<Func<int, int>> d = x => { return x + 1; };

1
我试图理解为什么Func允许大括号而Expression不允许。无论如何,表达式将被编译为Func,是否有任何方法可以向表达式树添加多行逻辑?如果没有,为什么要限制呢?
哈比卜

8
@Habeeb:“无论如何,表达式都会被编译为Func”,并非总是如此。很多时候,它根本没有被编译成委托-只是作为数据进行检查。.NET 4.0中的表达式树确实能够通过Expression.Block包含多个语句,但是C#语言不支持。可以,但是那将需要更多的设计/实施/测试工作。
乔恩·斯基特

26

您可以在lambda表达式中添加任意数量的换行符。C#忽略换行符。

您可能打算询问多个语句

可以将多个语句括在大括号中。

请参阅文档


17
说C#平等地对待所有空格(包括换行符)是否更准确?说它忽略换行符听起来有点误导-看起来好像完全将它们剥离了,您可以在换行符或其他内容之间拆分关键字。
Tesserex 2011年

6

从C#7开始:

单行语句:

int expr(int x, int y) => x + y + 1; 

多行语句:

int expr(int x, int y) { int z = 8; return x + y + z + 1; };

尽管这些被称为局部函数,但我认为这看起来比以下的更为干净,并且实际上是相同的

Func<int, int, int> a = (x, y) => x + y + 1;

Func<int, int, int> b = (x, y) => { int z = 8; return x + y + z + 1; };

4
Func<string, bool> test = (name) => 
{
   if (name == "yes") return true;
   else return false;
}

5
Func <string,bool> test = name => name ==“是”;
asawyer

3
政治是在展示问题所要求的多行格式,而不是招待高尔夫建议。要实施您的明智代码,将使其“不是答案”!
凯斯·贾德


0

在c#7.0中,您也可以像这样使用

Public string ParentMethod(int i, int x){
    int calculation = (i*x);
    (string info, int result) InternalTuppleMethod(param1, param2)
    {
        var sum = (calculation + 5);
        return ("The calculation is", sum);
    }
}

0

假设您有一堂课:

    public class Point
    {
        public int X { get; set; }
        public int Y { get; set; }
    }

在此类中使用C#7.0,即使没有大括号也可以做到:

Action<int, int> action = (x, y) => (_, _) = (X += x, Y += y);

Action<int, int> action = (x, y) => _ = (X += x, Y += y);

将与以下相同:

Action<int, int> action = (x, y) => { X += x; Y += y; };

如果您需要在一行中编写一个常规方法或构造函数,或者需要将一个以上的语句/表达式包装到一个表达式中,这也可能会有所帮助:

public void Action(int x, int y) => (_, _) = (X += x, Y += y);

要么

public void Action(int x, int y) => _ = (X += x, Y += y);

要么

public void Action(int x, int y) => (X, Y) = (X + x, Y + y);

有关文档中元组的解构的更多信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.