C#中Lambda表達式總結

来源:https://www.cnblogs.com/xu-yi/archive/2019/02/13/10372394.html
-Advertisement-
Play Games

在C#的語法中有一種比較特殊的寫法,叫做Lambda表達式,這種表達式的寫法在於你查詢數據的時候直接是使用以下箭頭的形式來表示查詢語句的:=>。例如,我們要查找學生的List<Student>集合中班級編號為1001的所有學生數據,我們即可用Studentlist.Where(t=>t.ClassC ...


       在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。

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

     (a,b)=>a==b

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

   (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中存儲

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

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

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

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

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

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

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

  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表達式的總結大致如此,從上述例子來看,可以大大簡化代碼的量,並增加可讀性。

    最後,附上博主的個人博客站點,更多的文章在博主的個人站點中,歡迎各位同行來進行指導交流,可點擊下列鏈接進入博主網站:IT技術小屋


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文的目的並不是讓你對 更加瞭解,然後靈活運用;因為 的一個歷史遺留的類,目前並不建議使用,所以本文主要和 對比,感受同樣功能的不同實現,知道什麼是好的代碼;所以在閱讀本文之前最好先瞭解一下 ,可以參考 "HashMap 相關" ; 一、 類定義 可以看到它和 雖然都是哈希表,但是結構完全不一樣,他 ...
  • 今天,是我來到博客園的第五天,發現自己還沒有頭像,想著上傳ubuntu系統中我很喜歡的一個背景圖片來當頭像,但是因為圖片過大,上傳失敗了。那麼,我們如何使用python中強大的PIL庫來進行圖片裁剪呢? 首先,找到自己的圖片位置,接著如下: 一、從PIL庫中導入Image 二、調用Image.ope ...
  • JVM記憶體模型 java虛擬機在執行java程式的過程中會把它所管理的記憶體劃分為不同的若幹個不同的的數據區域,這些區域都有各自的用途,以及創建和銷毀的時間,有的區域隨著虛擬機的進程的啟動而存在,有些區域依賴用戶線程的啟動和結束而創建和銷毀,java虛擬機所管理的記憶體將會包括以下幾個運行時數據區域 J ...
  • 環境說明:Windows 10 build 17763 + Python 3.7.2 介紹 pipenv 是在 pip 與 virtualenv 基礎上發展而來的,彌補了之前 virtualenv 通過 requirements.txt 來管理項目包等方面的不足,此外還有所擴展,功能更加強大, 已經 ...
  • 一.前言 1.自動裝配儘量不要用,不如使用set明確 二. 通過構造函數註入值(Bean中可以沒有get,set方法) 三. 自動裝配bean的屬性值 (1) byName的用法: (2) byType: byType:尋找和屬性類型相同的bean, 找不到,裝不上,找到多個拋異常。 (3) con ...
  • 題意 "題目鏈接" Sol 質數的限制並沒有什麼卵用,直接容斥一下:答案 = 忽略質數總的方案 沒有質數的方案 那麼直接dp,設$f[i][j]$表示到第i個位置,當前和為j的方案數 $f[i + 1][(j + k) \% p] += f[i][j]$ 矩乘優化一下。 cpp include de ...
  • 題目: 上代碼: 今天運氣有點炸裂,又一遍AC了。 發現一個規律,那種需要統計一些數的出現次數的類型的題,都可以用一個數組來統計,數組的下標代表被統計的數,對應的元素代表計數的值。上一題也是這樣一個例子,這樣想可以把問題簡化很多。 ...
  • 題目: 以上是新浪微博中一奇葩貼:“我出生於1988年,直到25歲才遇到4個數字都不相同的年份。”也就是說,直到2013年才達到“4個數字都不相同”的要求。本題請你根據要求,自動填充“我出生於y年,直到x歲才遇到n個數字都不相同的年份”這句話。 輸入格式: 輸入在一行中給出出生年份y和目標年份中不同 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...