淺談Linq查詢

一.Var關鍵字api

在學習Linq查詢以前,咱們先來學習var關鍵字的用法,看看微軟官方的定義:從Visual C#3.0開始,在方法範圍聲明的變量能夠具備隱式「類型」 var隱式類型的局部變量是強類型的,就像您本身聲明瞭類型同樣,但編譯器肯定了類型。從這個定義咱們有兩點須要注意,首先用var申明的隱式類型的局部變量是強類型的,二.var的推斷類型是在編譯的時候肯定的,不是在運行的時候。app

再看看微軟官方給出的兩個例子:學習

// Example #1: var is optional when
// the select clause specifies a string
string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
var wordQuery = from word in words
                where word[0] == 'g'
                select word;

// Because each element in the sequence is a string, 
// not an anonymous type, var is optional here also.
foreach (string s in wordQuery)
{
    Console.WriteLine(s);
}

var容許使用但不是必需的,由於查詢結果的類型能夠明確地表示爲IEnumerable<string>ui

// Example #2: var is required because
// the select clause specifies an anonymous type
var custQuery = from cust in customers
                where cust.City == "Phoenix"
                select new { cust.Name, cust.Phone };

// var must be used because each item 
// in the sequence is an anonymous type
foreach (var item in custQuery)
{
    Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
}

var容許結果是匿名類型的集合,除了編譯器自己以外,不能訪問該類型的名稱。使用var消除了爲結果建立新類的要求spa

 在第二個例子中假如不用var關鍵字的話咱們就要事先建立好類,查詢條件一變,查詢結果就跟着改變,又要定義新的類型,linq查詢的條件是隨意變化的,不可能條件一變就聲明新的類型,因此var關鍵字對linq查詢相當重要的。code

二.匿名類對象

 建立一個對象必定要先定義這個對象的類型麼,固然不是,咱們能夠經過匿名類的方式來建立對象,看看下面這段代碼:blog

  static void Main(string[] args)
        {
            string name = "Tom";
            int age = 20;
            var obj = new { name,age };
            Console.WriteLine(obj.age.ToString() + obj.name.ToString());
            Console.Read();

        }

三.Linq查詢接口

Linq查詢實質是操做集合的一系列擴展方法,Linq特性的核心接口是IEnumerable,只有實現了IEnumerable接口的集合才能夠用Linq查詢。ci

Linq的查詢包含三種方法:

1.使用語法查詢,這種查詢方式和SQL語句比較像:

// Query #1.
            List<int> objInt = new List<int> { 1, 2, 5, 4, 3, 9, 7, 6, 11, 29, 99 };
            var result = from i in objInt
                         where i > 3 && i < 20
                         orderby i descending
                         select i;

            foreach (var item in result)
            {
                Console.WriteLine(item.ToString());
            }

            Console.Read();

            // Query #2.
            List<string> objListString = new List<string> { "abc", "acd", "bcv", "bcd", "cnh", "ckl", "glk" };
            var strResult = from str in objListString
                            group str by str[0];
            foreach (var item in strResult)
            {
                foreach (var item1 in item)
                {
                    Console.WriteLine(item1);
                }
            }

            Console.Read();

        }

2.使用擴展方法查詢:

某些方法查詢必須表現爲方法調用,最多見的此類方法是可返回單一數值的方法,例如 SumMaxMinAverage 等。 這些方法在任何查詢中都必須始終最後一個調用,由於它們只表示單個值,不能用做其餘查詢操做的源。

擴展方法select的使用:

 static void Main(string[] args)
        {
            int[] nums = { 1, 7, 2, 6, 5, 4, 9, 13, 20 };

            var list = nums.Select(item => item * item);
            foreach (int item in list)
            {
                Console.WriteLine(item);
            }

            Console.ReadLine();
        }

擴展方法Where的使用:

  static void Main(string[] args)
        {
            int[] nums = { 1, 7, 2, 6, 5, 4, 9, 13, 20 };

            var list = nums
                .Where(item => item % 2 == 0)
                .Select(i => i * i);

            Console.ReadLine();
        }

擴展方法orderby的用法:

        static void Main(string[] args)
        {
            int[] nums = { 1, 7, 2, 6, 5, 4, 9, 13, 20 };
            var list = nums
                .Where(item => item % 2 == 0)
                .Select(i => i * i)
                .OrderBy(item => item);
            foreach (int i in list)
            {
                Console.WriteLine(i);
            }

            Console.ReadLine();
        }

static void Main(string[] args)
{
string[] nums = { "張勇", "王琦", "劉靜", "趙鑫鑫",
"杜麗", "馬俊才", "那英", "成龍", };

 
 

var list = nums
.Where(item => item.Length == 2)
.Select(item => item)
.OrderByDescending(item => item.Substring(0, 1));
foreach (string item in list)
{
Console.WriteLine(item);
}

 
 

Console.ReadLine();
}

3.結合使用查詢語法和方法語法:

int numCount1 =
    (from num in numbers1
     where num < 3 || num > 7
     select num).Count();

因爲查詢 返回單個值而不是集合,所以查詢當即執行

相關文章
相關標籤/搜索