[讀書筆記] Stephens' C# Programming with Visual Studio 2010 24-Hour Trainer 第三十七章

  • 1273
  • 0

閱讀Stephens' C#教材第三十七章筆記 介紹LINQ的基本觀念。

 

Chapter 37 LINQ to Objects
 
前兩章討論透過Visual Studio的精靈操作一個簡單的資料庫程式。
 
本章將介紹LINQ(Language-Integrated Query),它提供另外一種方法讓程式與資料連接起來,並且提供簡單的方式在資料來源中存取資料,LINQ可操作的資料來源除了常見的資料庫類型外,對於陣列(Arrays)、集合(Collections)及檔案(files)也都可用同樣的方式存取。
 
LINQ提供四種技術存取不同的資料來源:
  1. LINQ to SQL:針對存在SQL Server中的資料
  2. LINQ to Dataset:針對存在其他資料庫中的資料
  3. LINQ to XML:針對存在XML(eXtensible Markup Language)檔案中的資料
  4. LINQ to Objects:針對存在Arrays、Collections、Lists、String及files等中的資料
 
LINQ操作的三個基本步驟
  • 創建一個資料源
  • 針對資料源建立一個查詢query
  • 執行查詢取得所要的資料
 
你可能會認為第三個步驟應該拆分為:執行查詢和取得資料兩步,其實這是LINQ的技術稱為延遲執行 (Deferred Execution),只有當要用資料時才執行查詢。
 
以查詢0到99間的偶數程式為例:
        // Display the even numbers between 0 and 99.
        private void Form1_Load(object sender, EventArgs e)
        {
            // 1. Create the data source.
            int[] numbers = new int[100];
            for (int i = 0; i < 100; i++)
            {
                numbers[i] = i;
            }

            // 2. Build a query to select data from the data source.
            var evenQuery =
                from int num in numbers
                where (num % 2 == 0)
                select num;

            // 3. Execute the query and process the result.
            foreach (int num in evenQuery)
            {
                evensListBox.Items.Add(num);
            }
        }
 
程式一開始先建立資料源,一個包含0到99的陣列,也許在其他程式會比較複雜,可能是一個含有Customer資料的list物件等。
第二段宣告一個查詢,裡面的意涵解釋如下:(可參考微軟網頁)
 
  • var:這是一個隱含型別能將保存查詢的結果,進一步的詳細資料請看微軟網頁
  • evenQuery:你可以想成這是儲存查詢結果的變數名稱
  • from int num in numbers:這一個語法是指從numbers中取出資料,並用int屬性的範圍變數num來代表。
  • where (num % 2 == 0):這一個語法是指過濾條件,在num結果中除2餘數要為0
  • select num:這一個語法告訴查詢要將範圍變數num作為回傳資料。對於這個範圍變數num不能進行2*num的操作,或是當作參數傳給建構子。
 
最後一段透過foreach的迴圈將evenQuery裡面的資料逐一取出,放到num變數並加到evensListBox中。
 
接下來介紹LINQ查詢的各部分:Where子句、Order by子句及Select子句等三部分。
 
使用LINQ最普遍的理由大概是因為可以過濾資料的Where子句,可以 where 子句中使用熟悉的 C# 邏輯運算子 AND 和 OR,套用所需數目的篩選條件運算式。甚至執行計算或是使用Function,例如,呼叫IsPrime函數傳回質數的範圍變數,如下列程式碼:
            var PrimeQuery =
                from int num in numbers
                where (IsPrime(num))
                select num;
 
FindCustomers程式中示範多段Where子句的用法。
 
 
通常傳回的結果如果能按某個欄位進行排序,會讓人更容易找到所要的資料,Order by子句就提供這樣的功能,加上ascending可讓資料遞增排序(由小到大,1-2-3或A-B-C),加上descending可以遞減排序(3-2-1或C-B-A)。
 
Select子句決定要從資料來源取出那些資料放到結果中,在LINQ中不只單純挑選資料,還可以同時設定資料的格式,例如FindStudents程式中,在Selct子句中搭配String.Format("(0) (1)\t{2:0.00}")的使用,讓資料顯示自動對齊。
 
LINQ還有很多本章沒有提到的功能,例如:
  • Group results to produce output lists that contain other lists
  • Take only as certain number of results or take results while a certain condition is ture
  • Skip a certain number of results or skip results a certain condition is true
  • Join objects selected from multiple data sources
詳細的資料請參考微軟網頁
 
 
TRY IT中示範如何將30章出現的檔案搜尋,用LINQ的方式做出來。。