问题描述
|
C#lambda表达式可以包含多个语句吗?
(编辑:如以下几个答案中所述,该问题最初询问的是“行”而不是“语句”。)
解决方法
当然:
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;
}
);
,您可以在lambda表达式中添加任意数量的换行符。 C#忽略换行符。
您可能打算询问多个语句。
可以将多个语句括在大括号中。
请参阅文档。
,(我假设您实际上是在谈论多个语句,而不是多行。)
您可以在带有括号的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> b = (x,y) => { int z = 8; return x + y + z + 1; };
,Func<string,bool> test = (name) =>
{
if (name == \"yes\") return true;
else return false;
}
,从Lambda表达式(C#编程指南)中:
lambda语句的主体可以
由任意数量的陈述组成;
但是实际上
通常不超过两个或三个。
,使用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,y) => _ = (X += x,Y += y);
将与以下相同:
Action<int,y) => { X += x; Y += y; };
如果您需要在一行中编写一个常规方法或构造函数,或者需要将一个以上的语句/表达式包装到一个表达式中,这也可能会有所帮助:
public void Action(int x,int y) => (_,Y += y);
要么
public void Action(int x,int y) => _ = (X += x,int y) => (X,Y) = (X + x,Y + y);
有关文档中元组解构的更多信息。