猿教程 Logo

Lambda表达式的解剖

C#3.0(.NET 3.5)引入了lambda表达式和LINQ。 lambda表达式是使用一些特殊语法表示匿名方法的较短方法。

例如,以下匿名方法检查学生是否是青少年:

C#相关实例:

delegate(Student s) { return s.Age > 12 && s.Age < 20; };

VB相关实例:

Dim isStudentTeenAger = Function(s As Student) As Boolean
                                    Return s.Age > 12 And s.Age < 20
                        End Function

上面的匿名方法可以使用C#和VB.Net中的Lambda表达式来表示,如下所示:

C#相关实例:

s => s.Age > 12 && s.Age < 20

VB相关实例:

Function(s) s.Age  > 12 And s.Age < 20

让我们看看lambda表达式是如何从以下匿名方法演变而来的。

相关实例:

delegate(Student s) { return s.Age > 12 && s.Age < 20; };

Lambda表达式从匿名方法演变,首先删除delegate关键字和参数类型并添加lambda运算符=>。


上面的lambda表达式绝对有效,但是如果我们只有一个返回值的语句,我们不需要花括号,返回和分号。 所以我们可以消除它。

此外,如果我们只有一个参数,我们可以删除括号()。


因此,我们得到lambda表达式:s => s.Age> 12 && s.Age <20其中s是参数,=>是lambda运算符,s.Age> 12 && s.Age <20是正文表达式 :


同样的方式我们在VB.Net中得到lambda表达式可以写成如下:


lambda表达式的调用方式与delegate using()相同。

注意

VB.Net不支持lambda运算符


具有多个参数的Lambda表达式:

如果需要传递多个参数,则可以将参数括在括号中,如下所示:

相关实例:

(s, youngAge) => s.Age >= youngage;

如果参数混乱,还可以给出每个参数的类型:

相关实例:

(Student s,int youngAge) => s.Age >= youngage;

相关实例:

Function(s, youngAge) s.Age >= youngAge

不带任何参数的lambda表达式:

在lambda表达式中不必有至少一个参数。 lambda表达式也可以不带任何参数指定。

相关实例:

() => Console.WriteLine("Parameter less lambda expression")

正文表达式中的多个语句:

如果要在主体中包含多个语句,可以使用大括号括起表达式:

C#相关实例:

(s, youngAge) =>
{
  Console.WriteLine("Lambda expression with multiple statements in the body");
    
  Return s.Age >= youngAge;
}

VB相关实例:

Function(s , youngAge)
    
    Console.WriteLine("Lambda expression with multiple statements in the body")
    
    Return s.Age >= youngAge

End Function

Lambda中的局部变量

您可以在表达式主体中声明一个变量,以便在表达式主体中的任何位置使用它,如下所示:

C#相关实例:

s =>
{
   int youngAge = 18;

    Console.WriteLine("Lambda expression with multiple statements in the body");

    return s.Age >= youngAge;
}

VB相关实例:

Function(s) 
                                      
        Dim youngAge As Integer = 18
            
        Console.WriteLine("Lambda expression with multiple statements in the body")
            
        Return s.Age >= youngAge
            
End Function

Lambda表达式也可以分配给内置的委托,如Func,Action和Predicate。


Func委托:

当你想从lambda表达式返回一些东西时,使用Func <> delegate。 Func <>委托中的最后一个参数类型是返回类型,rest是输入参数。 访问Func委托部分C#教程了解更多。

考虑下面的lambda表达式来确定学生是否是青少年。

相关实例:

Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20;

Student std = new Student() { age = 21 };

bool isTeen = isStudentTeenAger(std);// returns false

相关实例:

Dim isStudentTeenAger As Func(Of Student, Boolean) = Function(s) s.Age > 12 And s.Age < 20

Dim stud As New Student With {.Age = 21}

Dim isTeen As Boolean = isStudentTeenAger(stud) // returns false

在上面的例子中,Func委托期望第一个输入参数是Student类型,返回类型是boolean。 lambda表达式s => s.age> 12 && s.age <20满足Func <Student,bool>委托要求,如下所示:


上面显示的Func <>委托,将会是一个如下所示的函数。

C#相关实例:

bool isStudentTeenAger(Student s)
{
    return s.Age > 12 && s.Age < 20;
}

Action委托:

与Func委托不同,Action委托只能有输入参数。 当不需要从lambda表达式返回任何值时,请使用Action委托类型。

C#相关实例:

Action<Student> PrintStudentDetail = s => Console.WriteLine("Name: {0}, Age: {1} ", s.StudentName, s.Age);

Student std = new Student(){ StudentName = "Bill", Age=21};

PrintStudentDetail(std);//output: Name: Bill, Age: 21

VB相关实例:

Dim printStudentDetail As Action(Of Student) = Sub(s) Console.WriteLine("Name: {0}, Age: {1} ", s.StudentName, s.Age)
    
Dim stud As New Student With {.StudentName = "Bill", .Age = 21}
        
printStudentDetail(stud)//output: Name: Bill, Age: 21

LINQ中的Lambda表达式查询:

通常,lambda表达式与LINQ查询一起使用。 枚举静态类包括接受Func <TSource,bool>的IEnumerable <T>的Where扩展方法。 因此,IEnumerable <Student>集合的Where()扩展方法需要传递Func <Student,bool>,如下所示:


现在,您可以将分配给Func委托的lambda表达式传递给方法语法中的Where()扩展方法,如下所示:

相关实例:

IList<Student> studentList = new List<Student>(){...};

Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20;

var teenStudents = studentList.Where(isStudentTeenAger).ToList<Student>();

相关实例:

IList<Student> studentList = new List<Student>(){...};

Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20;

var teenStudents = from s in studentList
                   where isStudentTeenAger(s)
                   select s;

你可以在VB.Net中使用相同的方法来传递Func委托。

要点
  1. Lambda表达式是一种表示匿名方法的更短的方法。 

  2. Lambda表达式语法:parameters =>正文表达式

  3. Lambda表达式可以具有零参数。 

  4. Lambda表达式可以在括号()中有多个参数。

  5. Lambda表达式可以在大括号{}中的正文表达式中有多个语句。 

  6. Lambda表达式可以分配给Func,Action或Predicate委托。

  7.  Lambda表达式可以以类似的方式调用委托。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/Linq/linq-lambda-expression.html