天天看點

[C# 基礎知識系列]專題十六:Linq介紹

 本專題概要:

Linq是什麼

使用Linq的好處在哪裡

Linq的實際操作例子——使用Linq周遊檔案目錄

小結

 引言:

   終于到了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有一個全面的認識:

[C# 基礎知識系列]專題十六:Linq介紹

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

Linq to SQL 元件——可以查詢基于關系資料的資料(微軟本身隻是實作了對SQL Server的查詢,可以對資料庫中的資料進行查詢,修改,插入,删除,排序等操作

Linq to Dataset元件——可以查詢DasaSet對象中的資料,并對資料進行增删改查的操作

Linq to Objects元件——可以查詢IEnumberable 或IEnumberable<T>集合

Linq to XML 元件——可以差選和操作XML檔案,比Xpath操作XML更加友善

二、使用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 對比 

            Console.WriteLine("使用老方法來對集合對象查詢,查詢結果為:"); 

            OldQuery(); 

            Console.WriteLine("使用Linq方法來對集合對象查詢,查詢結果為:"); 

            LinqQuery(); 

            Console.Read(); 

            #endregion 

        } 

       #region Linq to Objects對比 

        // 使用Linq 和使用Foreach語句的對比 

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

        private static void OldQuery() 

            // 初始化查詢的資料 

            List<string> collection = new List<string>(); 

            for (int i = 0; i < 10; i++) 

            { 

                collection.Add("A"+i.ToString()); 

            } 

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

            List<string> queryResults = new List<string>(); 

            foreach (string s in collection) 

                // 擷取元素序号 

                int index = int.Parse(s.Substring(1)); 

                // 查詢序号為偶數的元素 

                if (index % 2 == 0) 

                { 

                    queryResults.Add(s); 

                } 

            // 輸出查詢結果 

            foreach (string s in queryResults) 

                Console.WriteLine(s); 

        // 2. 使用Linq傳回集合中序号為偶數的元素 

        private static void LinqQuery() 

                collection.Add("A" + i.ToString()); 

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

            var queryResults = from s in collection 

                               let index = int.Parse(s.Substring(1)) 

                               where index % 2 == 0 

                               select s; 

        #endregion 

 從上面的兩個方法比較中可以看出使用Linq對集合進行查詢時确實簡單了許多,并且也容易添加篩選條件(隻需要在Where 後面添加額外的篩選條件即可),運作結果當然也是我們期望的,下面也附上下運作結果截圖:

[C# 基礎知識系列]專題十六:Linq介紹

 2.2 查詢XML檔案

之前我們大部分都會使用XPath來對XML檔案進行查詢,然而使用XPath來查詢XML檔案需要首先知道XML檔案的具體結構,而Linq 查詢表達式在查詢XML資料的時,可以不需要知道XML檔案結構,并且編碼更加簡單,容易添加判斷的條件,下面就具體代碼來說明使用Linq查詢的好處(這裡假設一個場景——有一個定義Persons的XML檔案,現在我們要求查找出XML檔案中Name節點為“李四”的元素):

            #region Linq to XML 對比 

            Console.WriteLine("使用XPath來對XML檔案查詢,查詢結果為:"); 

            OldLinqToXMLQuery(); 

            Console.WriteLine("使用Linq方法來對XML檔案查詢,查詢結果為:"); 

            UsingLinqLinqtoXMLQuery(); 

            Console.ReadKey(); 

        }   

        #region Linq to XML 對比 

        // 初始化XML資料 

        private static string xmlString =  

            "<Persons>"+ 

            "<Person Id='1'>"+ 

            "<Name>張三</Name>"+ 

            "<Age>18</Age>"+ 

            "</Person>" + 

            "<Person Id='2'>"+ 

            "<Name>李四</Name>"+ 

            "<Age>19</Age>"+ 

            "</Person>"+ 

             "<Person Id='3'>" + 

            "<Name>王五</Name>" + 

            "<Age>22</Age>" + 

            "</Persons>"; 

        // 使用XPath方式來對XML檔案進行查詢 

        private static void OldLinqToXMLQuery() 

            // 導入XML檔案 

            XmlDocument xmlDoc = new XmlDocument(); 

            xmlDoc.LoadXml(xmlString); 

            // 建立查詢XML檔案的XPath 

            string xPath = "/Persons/Person"; 

            // 查詢Person元素 

            XmlNodeList querynodes = xmlDoc.SelectNodes(xPath); 

            foreach (XmlNode node in querynodes) 

                // 查詢名字為李四的元素 

                foreach (XmlNode childnode in node.ChildNodes) 

                    if (childnode.InnerXml == "李四") 

                    { 

                        Console.WriteLine("姓名為: "+childnode.InnerXml + "  Id 為:" + node.Attributes["Id"].Value); 

                    } 

        // 使用Linq 來對XML檔案進行查詢 

        private static void UsingLinqLinqtoXMLQuery() 

            // 導入XML 

            XElement xmlDoc = XElement.Parse(xmlString); 

            // 建立查詢,擷取姓名為“李四”的元素 

            var queryResults = from element in xmlDoc.Elements("Person") 

                               where element.Element("Name").Value == "李四" 

                               select element; 

            foreach (var xele in queryResults) 

                Console.WriteLine("姓名為: " + xele.Element("Name").Value + "  Id 為:" + xele.Attribute("Id").Value); 

 使用XPath方式來查詢XML檔案時,首先需要知道XML檔案的具體結構(代碼中需要指定XPath為"/Persons/Person", 這就說明必須知道XML的組成結構了),然而使用Linq方式卻不需要知道XML文檔結構,并且從代碼書寫的量上也可以看出使用Linq方式的簡潔性,下面附上運作結果截圖:

[C# 基礎知識系列]專題十六:Linq介紹

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

Linq 查詢表達式使用上更加簡單,而且也易于了解(沒有接觸過Linq的人也可以大緻猜出代碼的意圖是什麼的)

Linq 提供了更多的功能,我們可以查詢、排序、分組、增加和删除等操作資料的大部分功能

可以使用Linq處理多種資料源,也可以為特定的資料源定義自己的Linq實作(這點将會在深入了解Linq中與大家相信介紹)

三、Linq的實際操作例子——使用Linq周遊檔案目錄

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

     { 

         string desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 

         //FileQuery2(desktop); 

         if (!string.IsNullOrEmpty(FileQuery())) 

         { 

             Console.WriteLine(FileQuery()); 

         } 

         else 

             Console.WriteLine("電腦桌面上不存在text.txt檔案"); 

         Console.Read(); 

     } 

         // 使用Linq查詢 

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

     private static string FileQuery() 

         string desktopdir = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 

         // 獲得指定目錄和子目錄中的檔案名 

         string[] filenames = Directory.GetFiles(desktopdir, "*.*", SearchOption.AllDirectories); 

         List<FileInfo> files = new List<FileInfo>(); 

         foreach (var filename in filenames) 

             files.Add(new FileInfo(filename)); 

         var results = from file in files 

                       where file.Name == "text.txt" 

                       select file; 

         // 輸出查詢結果 

         StringBuilder queryResult = new StringBuilder(); 

         foreach (var result in results) 

             queryResult.AppendLine("檔案的路徑為: " + result.FullName); 

         return queryResult.ToString(); 

     /// <summary> 

     /// 使用遞歸來查找檔案 

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

     /// </summary> 

     private static void FileQuery2(string path) 

         // 獲得指定目錄中的檔案(包含子目錄) 

         string[] filenames = Directory.GetFiles(path); 

             Console.WriteLine("檔案的路徑為: " + result.FullName); 

         // 獲得所有子目錄 

         string[] dirs = Directory.GetDirectories(path); 

         if (dirs.Length > 0) 

             foreach (string dir in dirs) 

             { 

                 FileQuery2(dir); 

             } 

 運作結果為: 

[C# 基礎知識系列]專題十六:Linq介紹

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

四、小結

 到這裡本專題的内容就介紹完了, 本專題主要和大家簡單分享了下我對Linq的認識,希望讓大家對Linq有個大概的認識,在後面的深入了解Linq系列中将會和大家一起剖析下Linq的實作原理。并且這個專題也是C# 3特性中的最後一個特性的介紹了,在後面一個專題中将帶來C# 4中一個最重要的特性——動态類型(dynamic )的引入

<a href="http://down.51cto.com/data/2362016" target="_blank">附件:http://down.51cto.com/data/2362016</a>

     本文轉自LearningHard 51CTO部落格,原文連結:http://blog.51cto.com/learninghard/1097866,如需轉載請自行聯系原作者