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

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

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

82983 次浏览

您可以在 lambda 表达式中放置任意多的换行符; C # 忽略换行符。

你可能想问多个 声明

可以用大括号包装多个语句。

看看 文件

当然:

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;
}
);
Func<string, bool> test = (name) =>
{
if (name == "yes") return true;
else return false;
}

来自 Lambda 表达式(C # 编程指南):

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

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

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

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

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

假设你有一门课:

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

更多有关 解构文档中的元组的资料。

另一个例子。

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.