LINQ教程之LINQ簡介

一、為什麼要使用LINQ

要理解為什麼使用LINQ,先來看下面一個例子。假設有一個整數類型的數組,找到裡面的偶數並進行降序排序。

在C#2.0以前,如果要實現這樣的功能,我們必須使用'foreach'或'for'循環來遍歷數組,先找到偶數然後在降序排序,相關代碼如下:

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)
        {
            // 查詢出數組中的偶數並排序
            int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 };
            // 定義一個整數類型的集合,用來存放數組中的偶數
            List<int> list = new List<int>();
            // 遍歷數組查詢出偶數放到集合中
            foreach (int i in ints)
            {
                // 如果是偶數,把偶數加入到集合中
                if (i % 2 == 0)
                {
                    list.Add(i);
                }
            }

            // 正序排序
            list.Sort();
            // 反轉
            list.Reverse();
            // 輸出
            Console.WriteLine(string.Join(",",list));

            Console.ReadKey();
        }
    }
}

使用for循環很麻煩,而且不可維護和可讀。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)
        {
            // 查詢出數組中的偶數並排序
            int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 };

            //delegate(int item){return item % 2 == 0;}表示委托的實現
            List<int> list = IntExtension.where(ints, delegate(int item)
            {
                return item % 2 == 0;
            }).ToList();
            // 正序排序
            list.Sort();
            // 反轉
            list.Reverse();
            // 輸出
            Console.WriteLine(string.Join(",", list));

            Console.ReadKey();
        }
    }
}

所以,有瞭C#2.0,通過使用委托有瞭代理的優勢,不必使用for循環來查詢不同條件的數組。例如你可以使用相同的委托來查找數組中的奇數,並降序排序輸出,代碼如下圖所示:

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)
        {
            // 查詢出數組中的奇數並排序
            int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 };

            //delegate(int item){return item % 2 != 0;}表示委托的實現
            List<int> list = IntExtension.where(ints, delegate(int item)
            {
                return item % 2 != 0;
            }).ToList();
            // 正序排序
            list.Sort();
            // 反轉
            list.Reverse();
            // 輸出
            Console.WriteLine(string.Join(",", list));

            Console.ReadKey();
        }
    }
}

雖然使用delegate可以使程序的可讀性增加瞭,但是C#團隊認為他們仍然需要使代碼更加緊湊和可讀,所以他們在C#3.0中引入瞭擴展方法、Lambda表達式、匿名類型等新特性,你可以使用C#3.0的這些新特性,這些新特性的使用LINQ的前提,可以用來查詢不同類型的集合,並返回需要的結果。

下面的示例演示瞭如何使用LINQ和Lambda表達式根據特定條件來查詢數組,示例代碼如下:

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)
        {
            // 查詢出數組中的奇數並排序
            int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 };

            // 使用LINQ和Lambda表達式查詢數組中的偶數
            int[] intEvens= ints.Where(p => p % 2 == 0).ToArray();
            // 使用LINQ和Lambda表達式查詢數組中的奇數
            int[] intOdds = ints.Where(p => p % 2 != 0).ToArray();

            // 輸出
            Console.WriteLine("偶數:" + string.Join(",", intEvens));
            Console.WriteLine("奇數:" + string.Join(",", intOdds));

            Console.ReadKey();
        }
    }
}

在上面的例子中可以看到,我們在單個語句中使用LINQ和Lambda表達式指定不同的查詢條件,因此,LINQ使代碼更加緊湊和可讀,並且它也可以用於查詢不同的數據源。看到這裡的時候,你可能會問:究竟什麼是LINQ呢?下面將會具體講解什麼是LINQ。

二、什麼是LINQ

長期以來,開發社區形成以下的格局:

1、面向對象與數據訪問兩個領域長期分裂,各自為政。

2、編程語言中的數據類型與數據庫中的數據類型形成兩套不同的體系,例如:

C#中字符串用string數據類型表示。

SQL中字符串用NVarchar/Varchar/Char數據類型表示。

3、SQL編碼體驗落後

沒有智能感知效果。

沒有嚴格意義上的強類型和類型檢查。

4、SQL和XML都有各自的查詢語言,而對象沒有自己的查詢語言。

上面描述的問題,都可以使用LINQ解決,那麼究竟什麼是LINQ呢?

LINQ(Language Integrated Query)即語言集成查詢。

LINQ是一組語言特性和API,使得你可以使用統一的方式編寫各種查詢。用於保存和檢索來自不同數據源的數據,從而消除瞭編程語言和數據庫之間的不匹配,以及為不同類型的數據源提供單個查詢接口。

LINQ總是使用對象,因此你可以使用相同的查詢語法來查詢和轉換XML、對象集合、SQL數據庫、ADO.NET數據集以及任何其他可用的LINQ提供程序格式的數據。

LINQ主要包含以下三部分:

  • 1、LINQ to Objects      主要負責對象的查詢。
  • 2、LINQ to XML           主要負責XML的查詢。
  • 3、LINQ to ADO.NET   主要負責數據庫的查詢。
    • LINQ to SQL
    • LINQ to DataSet
    • LINQ to Entities

三、LINQ的優勢

1、熟悉的語言:開發人員不必為每種類型的數據源或數據格式學習新的語言。

2、更少的編碼:相比較傳統的方式,LINQ減少瞭要編寫的代碼量。

3、可讀性強:LINQ增加瞭代碼的可讀性,因此其他開發人員可以很輕松地理解和維護。

4、標準化的查詢方式:可以使用相同的LINQ語法查詢多個數據源。

5、類型檢查:程序會在編譯的時候提供類型檢查。

6、智能感知提示:LINQ為通用集合提供智能感知提示。

7、整形數據:LINQ可以檢索不同形狀的數據。

到此這篇關於語言集成查詢LINQ的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: