LINQ Lambda 表達(dá)式

C#3.0(.NET 3.5)引入了lambda表達(dá)式以及 LINQ。lambda表達(dá)式是使用某些特殊語(yǔ)法表示匿名方法的一種較短方法。

例如,采用以下匿名方法檢查學(xué)生是否為青少年:

delegate(Student s) { return s.Age > 12 && s.Age < 20; };
Dim isStudentTeenAger = Function(s As Student) As Boolean
                                    Return s.Age > 12 And s.Age < 20
                        End Function

可以使用C#和VB.Net中的Lambda表達(dá)式來(lái)表示上述匿名方法,如下所示:

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

讓我們看看lambda表達(dá)式是如何從以下匿名方法演變而來(lái)的。

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

Lambda表達(dá)式是通過(guò)首先刪除委托關(guān)鍵字和參數(shù)類型并添加lambda運(yùn)算符=>從匿名方法演變而來(lái)的。

來(lái)自匿名方法的Lambda表達(dá)式

上面的lambda表達(dá)式絕對(duì)有效,但是如果我們只有一個(gè)返回值的語(yǔ)句,則不需要花括號(hào),return和分號(hào)。因此我們可以刪除它。

另外,如果只有一個(gè)參數(shù),則可以刪除括號(hào)()。

來(lái)自匿名方法的Lambda表達(dá)式

因此,我們得到了lambda表達(dá)式:s => s.Age > 12 && s.Age < 20 其中s是參數(shù),=>是lambda運(yùn)算符,s.Age > 12 && s.Age < 20是表達(dá)式主體:

C#中的Lambda表達(dá)式結(jié)構(gòu)

我們?cè)赩B.Net中獲得lambda表達(dá)式的方式可以如下編寫(xiě):

VB.Net中的Lambda表達(dá)式結(jié)構(gòu)

lambda表達(dá)式的調(diào)用方式與使用()的委托調(diào)用方式相同。

注意:VB.Net不支持lambda運(yùn)算符=>

具有多個(gè)參數(shù)的Lambda表達(dá)式

如果您需要傳遞多個(gè)參數(shù),則可以將參數(shù)括在括號(hào)中,如下所示:

    示例:在Lambda表達(dá)式C#中指定多個(gè)參數(shù)

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

如果覺(jué)得參數(shù)表達(dá)不清,您還可以給出每個(gè)參數(shù)的類型:

(Student s,int youngAge) => s.Age >= youngage;
示例:在Lambda表達(dá)式中指定多個(gè)參數(shù)VB.Net
Function(s, youngAge) s.Age >= youngAge

不帶參數(shù)的Lambda表達(dá)式

lambda表達(dá)式中不必至少有一個(gè)參數(shù)。lambda表達(dá)式也可以不帶任何參數(shù)來(lái)指定。

() => Console.WriteLine("無(wú)參數(shù) lambda 表達(dá)式")

Lambda表達(dá)主體中的多個(gè)語(yǔ)句

如果要在主體中包含多個(gè)語(yǔ)句,可以將表達(dá)式用大括號(hào)括起來(lái):

(s, youngAge) =>{
  Console.WriteLine("在主體中包含多個(gè)語(yǔ)句的Lambda表達(dá)式");
    
  Return s.Age >= youngAge;}
Function(s , youngAge)
    
    Console.WriteLine("在主體中包含多個(gè)語(yǔ)句的Lambda表達(dá)式")
    
    Return s.Age >= youngAge

End Function

在Lambda表達(dá)主體中聲明局部變量

您可以在表達(dá)式主體中聲明一個(gè)變量,以在表達(dá)式主體中的任何地方使用它,如下所示:

s =>
{   int youngAge = 18;

    Console.WriteLine("在主體中包含多個(gè)語(yǔ)句的Lambda表達(dá)式");

    return s.Age >= youngAge;
}
Function(s) 
                                      
        Dim youngAge As Integer = 18
            
        Console.WriteLine("在主體中包含多個(gè)語(yǔ)句的Lambda表達(dá)式")
            
        Return s.Age >= youngAge
            
End Function

Lambda表達(dá)式也可以分配給內(nèi)置委托,例如Func,Action和Predicate。

將Lambda表達(dá)式分配給委托

可以將lambda表達(dá)式分配給Func<in T, out TResult>委托類型。Func委托中的最后一個(gè)參數(shù)類型是返回類型,其余參數(shù)是輸入?yún)?shù)。訪問(wèn)C#教程的Func委托部分以了解更多信息。

考慮以下lambda表達(dá)式,以了解學(xué)生是否是青少年。

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

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

bool isTeen = isStudentTeenAger(std);// 返回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) // 返回 false

在上面的示例中,F(xiàn)unc委托期望第一個(gè)輸入?yún)?shù)為Student類型,而返回類型為布爾值。lambda表達(dá)式 s => s.age > 12 && s.age < 20滿足Func <Student,bool>委托要求,如下所示:

具有Lambda 表達(dá)式的Func委托

上面顯示的Func <>委托將變成一個(gè)如下所示的函數(shù)。

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

Action 委托

與Func委托不同,Action委托只能具有輸入?yún)?shù)。當(dāng)您不需要從lambda表達(dá)式返回任何值時(shí),請(qǐng)使用Action委托類型。

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

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

PrintStudentDetail(std);//輸出: Name: Bill, Age: 21
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)//輸出: Name: Bill, Age: 21

LINQ查詢中的Lambda表達(dá)式

通常,lambda表達(dá)式與LINQ查詢一起使用??擅杜e的靜態(tài)類包括其中的擴(kuò)展方法IEnumerable<T>wheres接受Func<TSource,bool>。因此,收集的Where()擴(kuò)展方法IEnumerable<Student>需要通過(guò)Func<Student,bool>,如下所示:

Where擴(kuò)展方法中的Func委托參數(shù)

因此,現(xiàn)在,您可以使用Where()如下所示的方法語(yǔ)法將分配給Func委托的lambda表達(dá)式傳遞給擴(kuò)展方法:

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中遵循相同的方法來(lái)傳遞Func委托。

要記住的要點(diǎn)

  1. Lambda表達(dá)式是表示匿名方法的簡(jiǎn)寫(xiě)方法。

  2. Lambda表達(dá)式語(yǔ)法: 參數(shù) => 表達(dá)式主體

  3. Lambda表達(dá)式可以具有零參數(shù)。

  4. Lambda表達(dá)式的括號(hào)()中可以有多個(gè)參數(shù)。

  5. Lambda表達(dá)式可以在大括號(hào){}中的主體表達(dá)式中包含多個(gè)語(yǔ)句。

  6. Lambda表達(dá)式可以分配給Func,Action或Predicate委托。

  7. 可以以類似于委托的方式調(diào)用Lambda Expression。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清