C 基礎知識系列 專題十六 Linq介紹

2021-09-05 05:37:44 字數 4676 閱讀 2353

本專題概要:

引言:

終於到了c# 3中最重要特性的介紹了,可以說之前所有介紹的特性都是為了linq而做準備的,然而要想深入理解linq並不是這個專題可以介紹完的,所以我打算這個專題將對linq做乙個簡單的介紹,對於linq的深入理解我將會後面單獨作為乙個系列要和大家分享下。

一、linq是什麼?

linq也就是language integrated query的縮寫,即語言整合查詢,是微軟在.net 3.5中提出的一項新技術, linq主要包含4個元件——linq to objects、linq to xml、linq to dataset 和linq to sql。在這裡不會具體介紹這4個元件的內容,只會給出乙個大致的介紹, 下面先看看linq的乙個架構圖,希望可以讓大家可以對linq有乙個全面的認識:

下面簡單介紹下四個元件:

二、使用linq的好處在**

第一部分中說到linq中包括四個元件,分別是對不同資料進行增刪改查的一些操作,然而以前也是有相關技術來對這些資料進行操作,(例如,對資料庫的操作,之前有ado.net 對其進行支援,對xml的操作,之前也可以xpath來操作xml檔案等), 此時應該大家都會有個疑問的——為什麼以前都有相關的技術對其進行支援,那我們為什麼還需要linq呢?對於這個疑問答案很簡單,linq 使操作這些資料來源更加簡單,方便和易於理解,之前的技術操作起來過於繁瑣,所以微軟也有上進心啊,希望可以做的更好啊,所以就在c# 3中提出了linq來方便大家操作這些資料來源,下面通過對比來說明linq是如何簡單方便:

2.1 查詢集合中的資料

之前我們查詢集合中的資料一般會使用for或foreach語句來進行查詢,而linq 使用查詢表示式來進行查詢,linq 表示式比之前用for或forach的方式更加簡潔,比較容易新增篩選條件,下面就具體看看兩者方式的比較**(我們這裡假設乙個場景——返回集合中序號為偶數的元素)

使用foreach 語句來返回序號為偶數的元素的實現**如下:

static

void main(string args) 

#region linq to objects對比

// 使用linq 和使用foreach語句的對比

// 1. 使用foreach返回集合中序號為偶數的元素

private

static

void oldquery() 

// 建立儲存查詢結果的集合

list queryresults = new list(); 

foreach (string s in collection)  } 

// 輸出查詢結果

foreach (string s in queryresults)  } 

// 2. 使用linq返回集合中序號為偶數的元素

private

static

void linqquery() 

// 建立查詢表示式來獲得序號為偶數的元素

var queryresults = from s in collection 

let index = int.parse(s.substring(1)) 

where index % 2 == 0 

select s; 

// 輸出查詢結果

foreach (string s in queryresults)  } 

#endregion

從上面的兩個方法比較中可以看出使用linq對集合進行查詢時確實簡單了許多,並且也容易新增篩選條件(只需要在where 後面新增額外的篩選條件即可),執行結果當然也是我們期望的,下面也附上下執行結果截圖:

2.2 查詢xml檔案

之前我們大部分都會使用xpath來對xml檔案進行查詢,然而使用xpath來查詢xml檔案需要首先知道xml檔案的具體結構,而linq 查詢表示式在查詢xml資料的時,可以不需要知道xml檔案結構,並且編碼更加簡單,容易新增判斷的條件,下面就具體**來說明使用linq查詢的好處(這裡假設乙個場景——有乙個定義persons的xml檔案,現在我們要求查詢出xml檔案中name節點為「李四」的元素):

static

void main(string args) 

#region linq to xml 對比

// 初始化xml資料

private

static

string xmlstring =  

""+ 

""+ 

"張三"+ 

"18"+ 

"" + 

""+ 

"李四"+ 

"19"+ 

""+ 

"" + 

"王五" + 

"22" + 

""+ 

""; 

// 使用xpath方式來對xml檔案進行查詢

private

static

void oldlinqtoxmlquery()  } 

} } 

// 使用linq 來對xml檔案進行查詢

private

static

void usinglinqlinqtoxmlquery()  } 

#endregion

使用xpath方式來查詢xml檔案時,首先需要知道xml檔案的具體結構(**中需要指定xpath為"/persons/person", 這就說明必須知道xml的組成結構了),然而使用linq方式卻不需要知道xml文件結構,並且從**書寫的量上也可以看出使用linq方式的簡潔性,下面附上執行結果截圖:

對於linq to sql 和linq to dataset的例子,我這裡就不一一給出了,從上面的兩個例子已經完全可以說明使用linq的好處了,下面總結我理解的好處有:

三、linq的實際操作例子——使用linq遍歷檔案目錄

通過前面兩部分大家大致可以知道linq的強大了吧,這部分就具體給出乙個例子來看看使用linq具體可以做些什麼事情的? 如果大家做乙個檔案管理系統的時候,大家都需要遍歷檔案目錄的吧,下面就使用linq來查詢在檔案目錄中的是否存在特定的檔案,具體**如下:

static

void main(string args) 

else

console.read(); 

} // 使用linq查詢

// 查詢桌面是否存在text.txt檔案

private

static

string filequery() 

var results = from file in files 

where file.name == "text.txt"

select file; 

// 輸出查詢結果

stringbuilder queryresult = new stringbuilder(); 

foreach (var result in results) 

return queryresult.tostring(); 

} /// 

/// 使用遞迴來查詢檔案

///  查詢桌面是否存在text.txt檔案

/// 

private

static

void filequery2(string path) 

var results = from file in files 

where file.name == "text.txt"

select file; 

// 輸出查詢結果

stringbuilder queryresult = new stringbuilder(); 

foreach (var result in results) 

// 獲得所有子目錄

string dirs = directory.getdirectories(path); 

if (dirs.length > 0)  } 

}  執行結果為:

我的電腦桌面檔案結果為:

desttop資料夾

text.txt

mytext資料夾

text資料夾

text.txt

text.txt

四、小結到這裡本專題的內容就介紹完了, 本專題主要和大家簡單分享了下我對linq的認識,希望讓大家對linq有個大概的認識,在後面的深入理解linq系列中將會和大家一起剖析下linq的實現原理。並且這個專題也是c# 3特性中的最後乙個特性的介紹了,在後面乙個專題中將帶來c# 4中乙個最重要的特性——動態型別(dynamic)的引入

C 基礎知識系列 專題四 事件揭秘

引言 前面幾個專題對委託進行了詳細的介紹的,然後我們在編寫 過程中經常會聽到 事件 這個概念的,尤其是寫ui的時候,當我們點選乙個按鈕後vs就會自動幫我們生成一些後台的 然後我們就只需要在click方法裡面寫 就可以,所以可能有些剛接觸c 的朋友就覺得這樣很理所當然的,也沒有去思考這是為什麼的,為什...

專題一 Matlab基礎知識

1.續行符 的使用 a 1 2 3 4 5 6 7 2.設定當前工作資料夾 例 設定為c盤work資料夾 cd c work 3.matlab搜尋路徑順序 4.path命令設定檔案搜尋路徑 例 path path,c work 1.資料型別 有符號整型 int8 無符號整型 uint8 單精度浮點型...

C 基礎知識系列之 for迴圈

c 的for迴圈提供的迭代迴圈機制是在執行下一次迭代前,測試是否滿足某個條件,其語法如下 for initializer,condition,iterator statement s 其中 initializer是指在執行第一次迭代前要計算的表示式 通常把乙個區域性變數初始化為迴圈計數器 condi...