1. 程式人生 > 其它 >C#中Lambda表示式總結

C#中Lambda表示式總結

在C#的語法中有一種比較特殊的寫法,叫做Lambda表示式,這種表示式的寫法在於你查詢資料的時候直接是使用以下箭頭的形式來表示查詢語句的:=>。例如,我們要查詢學生的List<Student>集合中班級編號為1001的所有學生資料,我們即可用Studentlist.Where(t=>t.ClassCode=‘1001’)語句來直接完成,無需再寫繁瑣的foreach語句或者for迴圈。Lambda表示式的運算子即為=>。

一、Lambda表示式定義

        Lambda表示式實際上是一種匿名函式,在Lambda表示式中可以包含語句以及運算等操作。並且可用於建立委託或表示式目錄樹型別,支援帶有可繫結到委託或表示式樹的輸入引數的內聯表示式。使用Lambda表示式可大大減少程式碼量,使得程式碼更加的優美、簡潔,更有可觀性。

 

二、Lambda表示式的表現形式

       表示式形式:(Input Param)=>Expression。在表示式左側的表示輸入引數,右側的為相應的運算語句或者判斷語句等,可包含函式呼叫等複雜方式。運算子=>讀作為goes to,例如下面這個表達t=>t.ClassCode='1001',多做goes to ClassCode equal 1001。

       在上述的表示式中,僅僅只有當引數只有一個的時候,括號是可選擇的,例如下面這種含有兩個引數時候的情況應該是這樣子的寫法

1 (a,b)=>a==b

  當表示式中的多個引數編譯器無法自動判斷型別的時候,則需要顯式指定型別。

1 (int firstIndex, string str) => str.IndexOf('Hello') > firstIndex

 

三、下面介紹List集合中的Lambda表示式的運用

       在C#的List集合中,我們時常需要使用到大量的運算或者篩選等操作,按常規的方式無非就是利用foreach或者for對List集合進行迴圈操作,最後運算出結果。此種方法往往需要寫多行語句,閱讀性稍微差點,當然複雜的情況下編寫也費時。博主遇到這種情況一般比較喜歡偷懶,很少會去直接寫迴圈,而是直接使用Lambda表示式一條語句完成。

     先假定好我們待會使用的範例的格式:

     studentList物件:此物件是一個List集合,集合中的物件為學生實體Student。此集合中存放著整個學校學生的資訊。

     scoreList物件:此物件是個List集合,集合中的物件是成績實體Score,此集合中存放著為學生的成績資訊。

     Student實體:此實體包含下列幾個屬性,StudentName,StudentCode,ClassCode,ClassName,BirthDay,Grade。以上幾個英文單詞都比較簡單,就不做解釋了。

     Score實體:此實體包含下列幾個屬性,StudentCode,SubjectName(科目名稱),ScoreValue(分數,0-100的數字)。一個學生可能有多門成績資料存放在此。

    (1)查詢班級編號為1001的班級下面的所有學生實體並返回到list1001中儲存

1 var list1001=Studentlist.Where(t=>t.ClassCode==‘1001’);

 (2)查詢班級編號為1001的班級下面的所有學生實體並返回到list1001中儲存,並按照學生的出生日期從小到大排列。

1 var list1001=Studentlist.Where(t=>t.ClassCode==‘1001’).OrderBy(t=>t.BirthDay);

   在此說一下,OrderBy是從小到大排序,需要從大到小排列則用OrderByDescending。

 (3)查詢班級編號為1001的班級下面的姓氏為【李】的同學的所有集合,並按照學生的出生日期從小到大排列。

1 var list1001=Studentlist.Where(t=>t.ClassCode==‘1001’&&t.StudentName.StartWith(“李”)).OrderBy(t=>t.BirthDay);

 (4)查詢出班級編號為1001的班級,並且存在至少一門考試科目成績低於60分的所有同學。

1 var result = studentList.Where(t => (t.ClassCode == "1001") && (scoreList.Exists(p => p.ScoreValue < 60 && p.StudentCode == t.StudentCode)));

  在上述語句中,lambda表示式中再次嵌入了一個lambda表示式。t引數是studentList中的lambda表示式引數,代表實體為student。p引數為scoreList中的lambda表示式引數,代表的實體為score。

   (5)其他較常用的Lambda表示式如下:

var a = studentList.FirstOrDefault(t => t.StudentCode == "10012");//FirstOrDefault返回第一個符合條件的資料,不存在的時候返回Null。
 var b = studentList.Count(t => t.StudentName == "李世民");//返回符合條件的實體個數
 var c = studentList.FindAll(t => t.StudentName.Contains("中"));//查詢所有名字中含有【中】的實體集合
 var d = studentList.GroupBy(t => t.ClassCode);//對studentList按照ClassCode分組
 var f = studentList.Max(t => t.BirthDay);//返回最大的出生日期。
 var e = scoreList.Sum(t => t.ScoreValue);//對所有成績求和
 var g = scoreList.Average(t => t.ScoreValue);//對所有成績求平均分
 var h = studentList.Select(t => t.StudentName).Distinct();//獲取所有的學生姓名,並去除重名

Lambda表示式的總結大致如此,從上述例子來看,可以大大簡化程式碼的量,並增加可讀性。