LINQ教程之LINQ簡介
一、為什么要使用LINQ
要理解為什么使用LINQ,先來看下面一個例子。假設(shè)有一個整數(shù)類型的數(shù)組,找到里面的偶數(shù)并進行降序排序。
在C#2.0以前,如果要實現(xiàn)這樣的功能,我們必須使用'foreach'或'for'循環(huán)來遍歷數(shù)組,先找到偶數(shù)然后在降序排序,相關(guān)代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LinqOfSelectOperation { class Program { static void Main(string[] args) { // 查詢出數(shù)組中的偶數(shù)并排序 int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 }; // 定義一個整數(shù)類型的集合,用來存放數(shù)組中的偶數(shù) List<int> list = new List<int>(); // 遍歷數(shù)組查詢出偶數(shù)放到集合中 foreach (int i in ints) { // 如果是偶數(shù),把偶數(shù)加入到集合中 if (i % 2 == 0) { list.Add(i); } } // 正序排序 list.Sort(); // 反轉(zhuǎn) list.Reverse(); // 輸出 Console.WriteLine(string.Join(",",list)); Console.ReadKey(); } } }
使用for循環(huán)很麻煩,而且不可維護和可讀。C#2.0引入了delegate,可以使用委托來處理這種場景,代碼如下圖所示:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LinqOfSelectOperation { // 定義委托 delegate bool FindEven(int item); class IntExtension { public static int[] where(int[] array, FindEven dele) { int[] result=new int[5]; int i = 0; foreach (int item in array) { if (dele(item)) { result[i]=item; i++; } } return result; } } class Program { static void Main(string[] args) { // 查詢出數(shù)組中的偶數(shù)并排序 int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 }; //delegate(int item){return item % 2 == 0;}表示委托的實現(xiàn) List<int> list = IntExtension.where(ints, delegate(int item) { return item % 2 == 0; }).ToList(); // 正序排序 list.Sort(); // 反轉(zhuǎn) list.Reverse(); // 輸出 Console.WriteLine(string.Join(",", list)); Console.ReadKey(); } } }
所以,有了C#2.0,通過使用委托有了代理的優(yōu)勢,不必使用for循環(huán)來查詢不同條件的數(shù)組。例如你可以使用相同的委托來查找數(shù)組中的奇數(shù),并降序排序輸出,代碼如下圖所示:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LinqOfSelectOperation { // 定義委托 delegate bool FindEven(int item); class IntExtension { public static int[] where(int[] array, FindEven dele) { int[] result=new int[3]; int i = 0; foreach (int item in array) { if (dele(item)) { result[i]=item; i++; } } return result; } } class Program { static void Main(string[] args) { // 查詢出數(shù)組中的奇數(shù)并排序 int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 }; //delegate(int item){return item % 2 != 0;}表示委托的實現(xiàn) List<int> list = IntExtension.where(ints, delegate(int item) { return item % 2 != 0; }).ToList(); // 正序排序 list.Sort(); // 反轉(zhuǎn) list.Reverse(); // 輸出 Console.WriteLine(string.Join(",", list)); Console.ReadKey(); } } }
雖然使用delegate可以使程序的可讀性增加了,但是C#團隊認為他們?nèi)匀恍枰勾a更加緊湊和可讀,所以他們在C#3.0中引入了擴展方法、Lambda表達式、匿名類型等新特性,你可以使用C#3.0的這些新特性,這些新特性的使用LINQ的前提,可以用來查詢不同類型的集合,并返回需要的結(jié)果。
下面的示例演示了如何使用LINQ和Lambda表達式根據(jù)特定條件來查詢數(shù)組,示例代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LinqOfSelectOperation { class Program { static void Main(string[] args) { // 查詢出數(shù)組中的奇數(shù)并排序 int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 }; // 使用LINQ和Lambda表達式查詢數(shù)組中的偶數(shù) int[] intEvens= ints.Where(p => p % 2 == 0).ToArray(); // 使用LINQ和Lambda表達式查詢數(shù)組中的奇數(shù) int[] intOdds = ints.Where(p => p % 2 != 0).ToArray(); // 輸出 Console.WriteLine("偶數(shù):" + string.Join(",", intEvens)); Console.WriteLine("奇數(shù):" + string.Join(",", intOdds)); Console.ReadKey(); } } }
在上面的例子中可以看到,我們在單個語句中使用LINQ和Lambda表達式指定不同的查詢條件,因此,LINQ使代碼更加緊湊和可讀,并且它也可以用于查詢不同的數(shù)據(jù)源??吹竭@里的時候,你可能會問:究竟什么是LINQ呢?下面將會具體講解什么是LINQ。
二、什么是LINQ
長期以來,開發(fā)社區(qū)形成以下的格局:
1、面向?qū)ο笈c數(shù)據(jù)訪問兩個領(lǐng)域長期分裂,各自為政。
2、編程語言中的數(shù)據(jù)類型與數(shù)據(jù)庫中的數(shù)據(jù)類型形成兩套不同的體系,例如:
C#中字符串用string數(shù)據(jù)類型表示。
SQL中字符串用NVarchar/Varchar/Char數(shù)據(jù)類型表示。
3、SQL編碼體驗落后
沒有智能感知效果。
沒有嚴格意義上的強類型和類型檢查。
4、SQL和XML都有各自的查詢語言,而對象沒有自己的查詢語言。
上面描述的問題,都可以使用LINQ解決,那么究竟什么是LINQ呢?
LINQ(Language Integrated Query)即語言集成查詢。
LINQ是一組語言特性和API,使得你可以使用統(tǒng)一的方式編寫各種查詢。用于保存和檢索來自不同數(shù)據(jù)源的數(shù)據(jù),從而消除了編程語言和數(shù)據(jù)庫之間的不匹配,以及為不同類型的數(shù)據(jù)源提供單個查詢接口。
LINQ總是使用對象,因此你可以使用相同的查詢語法來查詢和轉(zhuǎn)換XML、對象集合、SQL數(shù)據(jù)庫、ADO.NET數(shù)據(jù)集以及任何其他可用的LINQ提供程序格式的數(shù)據(jù)。
LINQ主要包含以下三部分:
- 1、LINQ to Objects 主要負責(zé)對象的查詢。
- 2、LINQ to XML 主要負責(zé)XML的查詢。
- 3、LINQ to ADO.NET 主要負責(zé)數(shù)據(jù)庫的查詢。
- LINQ to SQL
- LINQ to DataSet
- LINQ to Entities
三、LINQ的優(yōu)勢
1、熟悉的語言:開發(fā)人員不必為每種類型的數(shù)據(jù)源或數(shù)據(jù)格式學(xué)習(xí)新的語言。
2、更少的編碼:相比較傳統(tǒng)的方式,LINQ減少了要編寫的代碼量。
3、可讀性強:LINQ增加了代碼的可讀性,因此其他開發(fā)人員可以很輕松地理解和維護。
4、標(biāo)準(zhǔn)化的查詢方式:可以使用相同的LINQ語法查詢多個數(shù)據(jù)源。
5、類型檢查:程序會在編譯的時候提供類型檢查。
6、智能感知提示:LINQ為通用集合提供智能感知提示。
7、整形數(shù)據(jù):LINQ可以檢索不同形狀的數(shù)據(jù)。
到此這篇關(guān)于語言集成查詢LINQ的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
asp.core?同時兼容JWT身份驗證和Cookies?身份驗證兩種模式(示例詳解)
這篇文章主要介紹了asp.core?同時兼容JWT身份驗證和Cookies?身份驗證兩種模式,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02詳解ASP.NET Core 網(wǎng)站發(fā)布到Linux服務(wù)器
本篇文章主要介紹了ASP.NET Core 網(wǎng)站發(fā)布到Linux服務(wù)器 。具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-04-04Asp.net中Response.Charset與Response.ContentEncoding區(qū)別示例分析
這篇文章主要介紹了Asp.net中Response.Charset與Response.ContentEncoding區(qū)別示例分析,對于深入理解Asp.net程序設(shè)計有一定的幫助,需要的朋友可以參考下2014-08-08asp.net實現(xiàn)數(shù)據(jù)從DataTable導(dǎo)入到Excel文件并創(chuàng)建表的方法
這篇文章主要介紹了asp.net實現(xiàn)數(shù)據(jù)從DataTable導(dǎo)入到Excel文件并創(chuàng)建表的方法,涉及asp.net基于DataTable的數(shù)據(jù)庫及excel操作相關(guān)技巧,需要的朋友可以參考下2015-12-12Asp.Net Core中創(chuàng)建多DbContext并遷移到數(shù)據(jù)庫的步驟
這篇文章主要介紹了Asp.Net Core中創(chuàng)建多DbContext并遷移到數(shù)據(jù)庫的步驟,幫助大家更好的理解和學(xué)習(xí)使用Asp.Net Core,感興趣的朋友可以了解下2021-03-03VS2017 Cordova Ionic2 移動開發(fā)環(huán)境搭建教程
這篇文章主要為大家詳細介紹了VS2017 Cordova Ionic2 移動開發(fā)環(huán)境搭建教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04