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

时间:2011-04-13 18:17:56

标签: c# lambda

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

(编辑:正如以下几个答案中所提到的,这个问题最初是关于“行”而不是“陈述”。)

9 个答案:

答案 0 :(得分:165)

不确定

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;
            }
        );

答案 1 :(得分:28)

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

您可能想要询问多个语句

多个语句可以用大括号括起来。

请参阅documentation

答案 2 :(得分:25)

(我假设你真的在谈论多个陈述而不是多行。)

您可以使用大括号在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; };

答案 3 :(得分:4)

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

答案 4 :(得分:3)

来自Lambda Expressions (C# Programming Guide)

  

lambda声明的正文可以   由任意数量的陈述组成;   然而,在实践中有   通常不超过两三个。

答案 5 :(得分:3)

从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; };

答案 6 :(得分: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);
    }
}

答案 7 :(得分: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);

有关deconstruction of tuples in the documentation的更多信息。

答案 8 :(得分:0)

另一个例子。

var iListOfNumbers = new List<int>() { 1, 2, 3, 4, 5 };

Func<List<int>, int> arithmeticSum = iList =>
{
    var finalResult = 0;
            
    foreach (var i in iList)
        finalResult = finalResult + i;
            
    return finalResult;
};

Console.WriteLine(arithmeticSum.Invoke(iListOfNumbers));
Console.WriteLine(arithmeticSum(iListOfNumbers));
// The above two statements are exactly same.