玩轉C#之【LINQ 基本介紹】

更新於 發佈於 閱讀時間約 11 分鐘

介紹

LINQ全名是(Language-Integrated Query),是一組以直接將查詢功能整合至C# 語言為基礎之技術的名稱。
大家可以想像SQL有SQL的查詢語法,MySql有MySql的查詢語法,但我們可以只透過LINQ語法,C#會自動幫我們轉換成對應的資料庫查詢語法,有點像是秦始皇統一文字的這種感覺。
📷

歷史演進

C#1.0 1.1 時代 委派的做法
public class LambdaShow
{
public delegate void NoReturnNoPara();//定義一個委派
public delegate void NoReturnWthPara(int x,int y);//定義一個帶參數委派

public voui Show()
{
NoReturnNoPara method = new NoReturnNoPara(this.Donothing);//實體化一個委派
}

private void DoNothing()
{
Console.WriteLine("Test");
}
}
C# 2.0 時代 匿名方法
  • 除了可以少起方法名稱之外
  • 還可以讀取出K值
public voui Show()
{
int k =1;
NoReturnNoPara method = new NoReturnNoPara(delegate ()
{
Console.WriteLine(k);
Console.WriteLine("Test");
});
}
C# 3.0 時代 lambda
  • "=>" 稱之為goes to
  • 左邊是參數列表,右邊是方法體,本質是一個方法
public voui Show()
{
NoReturnNoPara method = new NoReturnNoPara( () =>
{
Console.WriteLine("Test");
});
}
//帶參數
public voui Show()
{
NoReturnWthPara method = new NoReturnWthPara( (int x,int y) =>
{
Console.WriteLine("Test");
});
}
//也可以省略參數型別
public voui Show()
{
NoReturnWthPara method = new NoReturnWthPara( (x,y) =>
{
Console.WriteLine("Test");
});
}
//如果方法體只有一行 可以去掉{} 跟;
public voui Show()
{
NoReturnWthPara method = new NoReturnWthPara( (x,y) => Console.WriteLine("Test"));
}
//new NoReturnWthPara() 也可以省略掉
public voui Show()
{
NoReturnWthPara method = (x,y) => Console.WriteLine("Test");
}
lambda表達式 是個什麼呢?
  • 首先不是委派,委派是類型
  • 也不是委派的實例 因為這裡是省略new 委派()
  • 只是一個方法(作用是一個方法) => 不完全正確
  • 編譯之後實際上是一個類中類,裡面的一個internal 方法,然後被綁定到靜態的委派類型
透過IL反編譯一下
📷

匿名類 var 擴展方法

普通的類別
Student student = new Student()
{
Id =1,
Name = "大禹治水",
Age = 25,
ClassId= 2
};
student.Study();
匿名類別 C#3.0
object model = new
{
Id = 2,
Name ="小帥哥",
Age =25,
ClassId= 2
};
Console.WriteLine(model.Id);//不能直接讀取Id 編譯器不允許通過
解決方式:
第一種
動態類型 C#4.0 =>可以避開編譯器檢查
dynamic dModel =new
{
Id = 2,
Name ="小帥哥",
Age =25,
ClassId= 2
};
Console.WriteLine(dModel.Id);
dModel.Id =3;
第二種
用var C#3.0
實際上編譯後有一個真實的類別,從反編譯工具可以看出只有Get方法所以不能Set
var dModel =new
{
Id = 2,
Name ="小帥哥",
Age =25,
ClassId= 2
};
Console.WriteLine(dModel.Id);
dModel.Id =3;//不能執行 因為只能Get 不能Set
📷
IL反編譯一下
📷
第三種
反射可以找到
var =>是一個語法糖,由編譯器自動推算類型
var =>宣告的時候就確定類型
var i1 =1;
var s="123";
s=123;//宣告的時候就確定類型
擴充方法 C#3.0
Student student = new Student()
{
Id =1,
Name = "大禹治水",
Age = 25,
ClassId= 2
};
student.Study();
我們希望學生能有一個唱歌的功能,但不希望修改原本的類別,但是又要增加方法
首先要是一個靜態類別,裡面的一個靜態方法
public static class ExtenedMethod
{
public static void Sing(Student student)
{
Console.WriteLine($"{student.Name} sing a Song");
}
}
正常情況下使用方式
ExtendMethod.Sing(student);
如果我們在第一個參數前面加上一個this
public static class ExtenedMethod
{
public static void Sing(this Student student)
{
Console.WriteLine($"{student.Name} sing a Song");
}
}
可以變成這樣
student.Sing();
擴充方法就是在靜態類別,裡面的一個靜態方法,第一個參數前面加上一個this
用途:可以不修改類,增加方法也就是改變寫法方便了一點
缺點:優先調用類型的方法(有隱患),
擴充父類型,導致任何子類別都有這個方法,而且還有可能被覆蓋,最好指定類型擴充

Linq to object

一般情況過濾數據
var list = new List<Student>();
foreach(var item in studentList)
{
if(item.Age < 30)
{
list.Add(item);
}
}
等價的做法
public static class ExtendMethod
{
public static List<Student>EleventWhere(this Kust<Student> source,Func<Student,bool> func)
{
var list = new List<Student>();
foreach(var item in source)
{
if(func.Invoke(item))
{
list.Add(item);
}
}

}
}
var result = list.EleventWhere(x=>x.Age < 30);//陳述式語法

yield 跌代器

  1. 基於委派封裝解構,去掉重複代碼
  2. 泛型,應對個總類型情況
  3. 加上跌代器,延遲獲取
public static IEnumberable<T> ElevenWhere<T>(this IEnumberable<T> source,Func<T,bool> func)
{
foreach(var item in source)
{
if(func.Invoke(item))
{
yield return item;
}
}
}

linq常用方法介紹

Where =>篩選
Select=>轉換
Min/Max/OrderBy/
Linq To Object(Enumerable)
Linq To Sql(Queryable) =>SQL+ADO.NET 表達式目錄樹解析SQL
📷
下一章節會正式介紹LINQ的語法

參考資料

本篇已同步發表至個人部落格
https://moushih.com/2022ithome13/
我的鐵人賽文章
https://ithelp.ithome.com.tw/articles/10289873
為什麼會看到廣告
avatar-img
8會員
39內容數
我是這個部落格的作者,喜歡分享有關投資 💰、軟體開發 💻、占卜 🔮 和虛擬貨幣 🚀 的知識和經驗。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
一代軍師 的其他內容
介紹 序列化、反序列化概念: 📷 關於泛型委派、解偶、非同步多執行緒、委派的歷史寫法演進之後會專門寫一篇文章跟大家講解 使用方式 測試資料 SerializableAttribute 微軟說明文件 二進位序列化 雖然這裡介紹BinaryFormatter但在 .NET 7中已經屬於過時的方法了
介紹 委派 透過委派可以實現把方法作為參數傳遞 從範例可以看出我們將DoNothing當成參數在傳遞 📷 事件 事件:是帶event關鍵字的委派的實體,可以限制變數被外部直接使用/直接賦予值(安全保障) 特點: 不能直接Invoke() 不能 賦予 null => = null 委派是一個類型
介紹 在過去的歷史裡開發程式都是以呼叫Function的方式來做程式開發,後來才有了物件導向設計的概念,而物件導向程式設計的概念就是,使用【物件】的方式來設計程式。 Q: 什麼是【物件】? A:【物件】會包含以下這四個特性: 抽象(Abstraction) 封裝(Encapsulation)
介紹 在程式中你看到上面有一個中括號[] 就是特性,它自身沒有任何功能。 📷 特性attribute,和注釋有什麼區別 第一個感受 特性:中括號宣告 錯覺:每一個特性都可以帶來對應的功能 實際上添加後,編譯器會在元素內部產生IL,但是我們是沒辦法直接使用的,而且在metadata會有紀錄 📷
介紹 反射:System.Reflection .Net框架提供的Library,可以讀取並使用metadata Dll-IL-Metadata-反射 透過VS編譯器 編譯成dll/exe 點擊exe的時候,他有一個依賴的環境叫做CLR IL:可以透過ILSpy(反編譯工具) 📷 一般情況
介紹 在C#2.0時代以前,是沒有泛型的,所以當我們遇到需求是方法內做相同的事情,但因為輸入或輸出的型別不一樣,我們就必須重複寫出類似的程式 以下的例子是=>不同的輸入型別 但卻做相同的事情 =>印出輸入資料 範例: 輸入參數:int或string或DateTime 功能:印出輸入的"數值"
介紹 序列化、反序列化概念: 📷 關於泛型委派、解偶、非同步多執行緒、委派的歷史寫法演進之後會專門寫一篇文章跟大家講解 使用方式 測試資料 SerializableAttribute 微軟說明文件 二進位序列化 雖然這裡介紹BinaryFormatter但在 .NET 7中已經屬於過時的方法了
介紹 委派 透過委派可以實現把方法作為參數傳遞 從範例可以看出我們將DoNothing當成參數在傳遞 📷 事件 事件:是帶event關鍵字的委派的實體,可以限制變數被外部直接使用/直接賦予值(安全保障) 特點: 不能直接Invoke() 不能 賦予 null => = null 委派是一個類型
介紹 在過去的歷史裡開發程式都是以呼叫Function的方式來做程式開發,後來才有了物件導向設計的概念,而物件導向程式設計的概念就是,使用【物件】的方式來設計程式。 Q: 什麼是【物件】? A:【物件】會包含以下這四個特性: 抽象(Abstraction) 封裝(Encapsulation)
介紹 在程式中你看到上面有一個中括號[] 就是特性,它自身沒有任何功能。 📷 特性attribute,和注釋有什麼區別 第一個感受 特性:中括號宣告 錯覺:每一個特性都可以帶來對應的功能 實際上添加後,編譯器會在元素內部產生IL,但是我們是沒辦法直接使用的,而且在metadata會有紀錄 📷
介紹 反射:System.Reflection .Net框架提供的Library,可以讀取並使用metadata Dll-IL-Metadata-反射 透過VS編譯器 編譯成dll/exe 點擊exe的時候,他有一個依賴的環境叫做CLR IL:可以透過ILSpy(反編譯工具) 📷 一般情況
介紹 在C#2.0時代以前,是沒有泛型的,所以當我們遇到需求是方法內做相同的事情,但因為輸入或輸出的型別不一樣,我們就必須重複寫出類似的程式 以下的例子是=>不同的輸入型別 但卻做相同的事情 =>印出輸入資料 範例: 輸入參數:int或string或DateTime 功能:印出輸入的"數值"
你可能也想看
Google News 追蹤
Thumbnail
/ 大家現在出門買東西還會帶錢包嗎 鴨鴨發現自己好像快一個禮拜沒帶錢包出門 還是可以天天買滿買好回家(? 因此為了記錄手機消費跟各種紅利優惠 鴨鴨都會特別注意銀行的App好不好用! 像是介面設計就是會很在意的地方 很多銀行通常會為了要滿足不同客群 會推出很多App讓使用者下載 每次
Thumbnail
本章節主要介紹Java語言中的函數(也稱為方法)的使用,包括函數的基本結構、函數表達式(Lambda表達式)、箭頭函數、匿名函數的使用,以及如何呼叫函數、如何使用函數參數和函數的返回值等內容。通過學習本章節,讀者將能夠熟練掌握Java語言中的函數相關知識,並能夠在實際編程中靈活運用。
Thumbnail
  全名為Language Integrated Query,又稱LINQ,它是什麼呢?用在哪裡呢?它是一個擁有「集合元素進行資料查詢」的技術,直接將此技術整合到C#裡,也就是說對於任何資料型態只要是遇到以下這幾個型別:
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
本章節旨在介紹 C# 中函數的基本結構,包括訪問修飾符、返回類型、方法名稱、參數列表和方法體。同時,也介紹了函數的各種呼叫方式、參數傳遞方式和返回值類型。讀者可以通過本章節,深入理解 C# 中函數的使用和應用。
Thumbnail
內容涵蓋資料型別、型別轉換、自訂型別、元組型別、集合型別和字典型別等主題。文章首先詳述內建型別如bool、byte、char等的定義和使用,接著討論型別轉換,包括隱含轉換和明確轉換。之後文章介紹自訂型別的建立,以及元組、集合、陣列和字典型別的操作與例子。
Thumbnail
C#程式由一或多個檔案組成,包含命名空間、類別、結構、介面、列舉和委派等型別。Main方法是C#應用程式的進入點。在C#中,註解用於在程式碼中添加說明,有單行和多行兩種類型。變數的定義需要指定變數的類型和名稱,可以一次為多個變數賦值。
Thumbnail
C#是一種開源、跨平台、面向對象的編程語言,具有類型安全、泛型、模式匹配等特性。廣泛應用於桌面和Web應用程序、遊戲開發、移動應用、雲計算等領域。全球數十萬家公司像微軟、Unity Technologies、Stack Overflow等使用C#支持其業務。C#還提供豐富的進階學習資源和主題。
Thumbnail
本文介紹了串列運算式的應用,以及與Lambda匿名函式方法的比較,並提供了程式範例。串列運算式提供了一種簡潔的語法,用於創建、轉換和過濾列表。lambda函式用於創建匿名函式,通常用於簡單的操作。建議在比較複雜的情況下使用一般for迴圈加if來表示。
Thumbnail
如果我只是想要重複做一些很簡單的運算,還有沒有更簡潔的方式,那就是Lambda匿名函式。 本文將介紹 : Lambda匿名函式的用法,也比較跟自定函式的差異之處。 結合map,filter,sorted函式做應用介紹
Thumbnail
lambda 函式,又稱為“匿名函式”,是一種在 Python 中快速定義單行函式的方法,與 def 定義函式不同,lambda 函式不需要命名。本文將介紹 lambda函式的基礎語法,以及實際應用範例演示。
Thumbnail
/ 大家現在出門買東西還會帶錢包嗎 鴨鴨發現自己好像快一個禮拜沒帶錢包出門 還是可以天天買滿買好回家(? 因此為了記錄手機消費跟各種紅利優惠 鴨鴨都會特別注意銀行的App好不好用! 像是介面設計就是會很在意的地方 很多銀行通常會為了要滿足不同客群 會推出很多App讓使用者下載 每次
Thumbnail
本章節主要介紹Java語言中的函數(也稱為方法)的使用,包括函數的基本結構、函數表達式(Lambda表達式)、箭頭函數、匿名函數的使用,以及如何呼叫函數、如何使用函數參數和函數的返回值等內容。通過學習本章節,讀者將能夠熟練掌握Java語言中的函數相關知識,並能夠在實際編程中靈活運用。
Thumbnail
  全名為Language Integrated Query,又稱LINQ,它是什麼呢?用在哪裡呢?它是一個擁有「集合元素進行資料查詢」的技術,直接將此技術整合到C#裡,也就是說對於任何資料型態只要是遇到以下這幾個型別:
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
本章節旨在介紹 C# 中函數的基本結構,包括訪問修飾符、返回類型、方法名稱、參數列表和方法體。同時,也介紹了函數的各種呼叫方式、參數傳遞方式和返回值類型。讀者可以通過本章節,深入理解 C# 中函數的使用和應用。
Thumbnail
內容涵蓋資料型別、型別轉換、自訂型別、元組型別、集合型別和字典型別等主題。文章首先詳述內建型別如bool、byte、char等的定義和使用,接著討論型別轉換,包括隱含轉換和明確轉換。之後文章介紹自訂型別的建立,以及元組、集合、陣列和字典型別的操作與例子。
Thumbnail
C#程式由一或多個檔案組成,包含命名空間、類別、結構、介面、列舉和委派等型別。Main方法是C#應用程式的進入點。在C#中,註解用於在程式碼中添加說明,有單行和多行兩種類型。變數的定義需要指定變數的類型和名稱,可以一次為多個變數賦值。
Thumbnail
C#是一種開源、跨平台、面向對象的編程語言,具有類型安全、泛型、模式匹配等特性。廣泛應用於桌面和Web應用程序、遊戲開發、移動應用、雲計算等領域。全球數十萬家公司像微軟、Unity Technologies、Stack Overflow等使用C#支持其業務。C#還提供豐富的進階學習資源和主題。
Thumbnail
本文介紹了串列運算式的應用,以及與Lambda匿名函式方法的比較,並提供了程式範例。串列運算式提供了一種簡潔的語法,用於創建、轉換和過濾列表。lambda函式用於創建匿名函式,通常用於簡單的操作。建議在比較複雜的情況下使用一般for迴圈加if來表示。
Thumbnail
如果我只是想要重複做一些很簡單的運算,還有沒有更簡潔的方式,那就是Lambda匿名函式。 本文將介紹 : Lambda匿名函式的用法,也比較跟自定函式的差異之處。 結合map,filter,sorted函式做應用介紹
Thumbnail
lambda 函式,又稱為“匿名函式”,是一種在 Python 中快速定義單行函式的方法,與 def 定義函式不同,lambda 函式不需要命名。本文將介紹 lambda函式的基礎語法,以及實際應用範例演示。