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

更新 發佈閱讀 11 分鐘

介紹

LINQ全名是(Language-Integrated Query),是一組以直接將查詢功能整合至C# 語言為基礎之技術的名稱。

大家可以想像SQL有SQL的查詢語法,MySql有MySql的查詢語法,但我們可以只透過LINQ語法,C#會自動幫我們轉換成對應的資料庫查詢語法,有點像是秦始皇統一文字的這種感覺。

raw-image

歷史演進

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反編譯一下

raw-image

匿名類 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
raw-image

第三種

反射可以找到

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

raw-image

下一章節會正式介紹LINQ的語法

參考資料

語言整合式查詢 (LINQ) (C#)

本篇已同步發表至個人部落格
https://moushih.com/2022ithome13/

我的鐵人賽文章

https://ithelp.ithome.com.tw/articles/10289873

留言
avatar-img
一代軍師
8會員
39內容數
我是這個部落格的作者,喜歡分享有關投資 💰、軟體開發 💻、占卜 🔮 和虛擬貨幣 🚀 的知識和經驗。
一代軍師的其他內容
2024/02/12
盤面基本組成要素 十天干:甲乙丙丁戊己庚辛壬癸 十二地支:子丑寅卯辰巳午未申酉戌亥 五行:木、火、土、金、水 八門:休、生、傷、杜、景、死、驚、開 八神:符、蛇、陰、合、虎、武、九、天 九星:蓬、任、沖、輔、英、芮、柱、心、禽 八卦:坎、艮、震、兌、離、坤、乾 六個旬首:甲子戊、甲戊
Thumbnail
2024/02/12
盤面基本組成要素 十天干:甲乙丙丁戊己庚辛壬癸 十二地支:子丑寅卯辰巳午未申酉戌亥 五行:木、火、土、金、水 八門:休、生、傷、杜、景、死、驚、開 八神:符、蛇、陰、合、虎、武、九、天 九星:蓬、任、沖、輔、英、芮、柱、心、禽 八卦:坎、艮、震、兌、離、坤、乾 六個旬首:甲子戊、甲戊
Thumbnail
2023/10/22
Drawmind 畫鏡 主要目的是透過藝術治療,幫助個人減輕情感壓力、提升心理健康,並提供一個具有專業指導的平台,讓用戶進行情感表達、自我探索和康復。
Thumbnail
2023/10/22
Drawmind 畫鏡 主要目的是透過藝術治療,幫助個人減輕情感壓力、提升心理健康,並提供一個具有專業指導的平台,讓用戶進行情感表達、自我探索和康復。
Thumbnail
2023/08/14
原理 八字 八字不等於出生時間 八字是根據每個兩小時為一個單位的時辰來劃分的。 它包括年、月、日和時這四個要素,其中年、月、日分別對應天干地支。 即使缺少具體出生時刻,也仍然可以排出命盤進行分析。 紫微斗數 需要精確的出生的小時數,因為出生時間的稍微差異呈現出來的命盤會有天差地別,從而
Thumbnail
2023/08/14
原理 八字 八字不等於出生時間 八字是根據每個兩小時為一個單位的時辰來劃分的。 它包括年、月、日和時這四個要素,其中年、月、日分別對應天干地支。 即使缺少具體出生時刻,也仍然可以排出命盤進行分析。 紫微斗數 需要精確的出生的小時數,因為出生時間的稍微差異呈現出來的命盤會有天差地別,從而
Thumbnail
看更多
你可能也想看
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
  全名為Language Integrated Query,又稱LINQ,它是什麼呢?用在哪裡呢?它是一個擁有「集合元素進行資料查詢」的技術,直接將此技術整合到C#裡,也就是說對於任何資料型態只要是遇到以下這幾個型別:
Thumbnail
  全名為Language Integrated Query,又稱LINQ,它是什麼呢?用在哪裡呢?它是一個擁有「集合元素進行資料查詢」的技術,直接將此技術整合到C#裡,也就是說對於任何資料型態只要是遇到以下這幾個型別:
Thumbnail
C#是一種開源、跨平台、面向對象的編程語言,具有類型安全、泛型、模式匹配等特性。廣泛應用於桌面和Web應用程序、遊戲開發、移動應用、雲計算等領域。全球數十萬家公司像微軟、Unity Technologies、Stack Overflow等使用C#支持其業務。C#還提供豐富的進階學習資源和主題。
Thumbnail
C#是一種開源、跨平台、面向對象的編程語言,具有類型安全、泛型、模式匹配等特性。廣泛應用於桌面和Web應用程序、遊戲開發、移動應用、雲計算等領域。全球數十萬家公司像微軟、Unity Technologies、Stack Overflow等使用C#支持其業務。C#還提供豐富的進階學習資源和主題。
Thumbnail
C# 9.0 給 Unity 程式設計上帶來的便利
Thumbnail
C# 9.0 給 Unity 程式設計上帶來的便利
Thumbnail
這篇文章將會講述使用 C# 的類( Class ) 來讓欄位模組(module)化。
Thumbnail
這篇文章將會講述使用 C# 的類( Class ) 來讓欄位模組(module)化。
Thumbnail
環境安裝 這邊可以先安裝Expression Tree Visualizer工具 Viusla studio 2019 安裝方式: 檔案(ExpressionTreeVisualizer.2019)下載完之後,將檔案複製到此目錄: C:\Program Files (x86)\Microsoft V
Thumbnail
環境安裝 這邊可以先安裝Expression Tree Visualizer工具 Viusla studio 2019 安裝方式: 檔案(ExpressionTreeVisualizer.2019)下載完之後,將檔案複製到此目錄: C:\Program Files (x86)\Microsoft V
Thumbnail
介紹 LINQ全名是(Language-Integrated Query),是一組以直接將查詢功能整合至C# 語言為基礎之技術的名稱。 大家可以想像SQL有SQL的查詢語法,MySql有MySql的查詢語法,但我們可以只透過LINQ語法,C#會自動幫我們轉換成對應的資料庫查詢語法,有點像是秦始皇統一
Thumbnail
介紹 LINQ全名是(Language-Integrated Query),是一組以直接將查詢功能整合至C# 語言為基礎之技術的名稱。 大家可以想像SQL有SQL的查詢語法,MySql有MySql的查詢語法,但我們可以只透過LINQ語法,C#會自動幫我們轉換成對應的資料庫查詢語法,有點像是秦始皇統一
Thumbnail
介紹 委派 透過委派可以實現把方法作為參數傳遞 從範例可以看出我們將DoNothing當成參數在傳遞 📷 事件 事件:是帶event關鍵字的委派的實體,可以限制變數被外部直接使用/直接賦予值(安全保障) 特點: 不能直接Invoke() 不能 賦予 null => = null 委派是一個類型
Thumbnail
介紹 委派 透過委派可以實現把方法作為參數傳遞 從範例可以看出我們將DoNothing當成參數在傳遞 📷 事件 事件:是帶event關鍵字的委派的實體,可以限制變數被外部直接使用/直接賦予值(安全保障) 特點: 不能直接Invoke() 不能 賦予 null => = null 委派是一個類型
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News