1. 程式人生 > >Linq之旅:Linq入門詳解(Linq to Objects)

Linq之旅:Linq入門詳解(Linq to Objects)

本博文詳細介紹 .NET 3.5 中引入的重要功能:Language Integrated QueryLINQ,語言整合查詢)。通過LINQ,我們可以使用相同API操作不同的資料來源。接下來就讓我們看看LINQ是什麼以及如何使用?

再此之前,需要先了解的相關技術

1.隱式型別、匿名型別、物件初始化器

1)隱式型別,使用var關鍵字建立,C#編譯器會根據用於初始化區域性變數的初始值推斷出變數的資料型別。(不過我個人認為,能用具體型別的地方儘量不要用var關鍵字,因為這樣會讓你遺忘“被封裝類庫”方法的返回值型別--有損可讀性)

隱式型別使用限制:

a)隱式型別只能應用於方法或者屬性內區域性變數的宣告,不能使用

var來定義返回值、引數的型別或型別的資料成員。

b)使用var進行宣告的區域性變數必須賦初始值,並且不能以null作為初始值。

2)匿名型別,只是一個繼承了Object的、沒有名稱的類。C#編譯器會在編譯時自動生成名稱唯一的類。

3)物件初始化器,提供一種非常簡潔的方式來建立物件和為物件的屬性賦值。(相關還有“集合初始化器”)

由於C#強型別語言,即我們在宣告變數時必須指定變數的具體型別。所以在建立匿名物件時,需要結合隱式型別、匿名型別、物件初始化器一起建立匿名物件。(避免型別轉換)

示例:

var person = new { name = “heyuquan” , age = 24 }

2.Lambda表示式,Func委託

1)Lambda表示式只是用更簡單的方式來書寫匿名方法,從而徹底簡化.NET委託型別的使用。

Lambda表示式在C#中的寫法是“arg-list => expr-body”,“=>”符號左邊為表示式的引數列表,右邊則是表示式體(body)。引數列表可以包含0到多個引數,引數之間使用逗號分割。

2)Func委託

Func委託,是微軟為我們預定義的常用委託,封裝一個具有:零個或多個指定型別的輸入引數並返回一個指定型別的結果值的方法。

image

示例:

        static void Main(string[] args)
        {
            // 委託函式
            Func<string, string, string> func1 = Hello;
            // 匿名方法
            Func<string, string, string> func2 =
                delegate(string a, string b) 
                { 
                    return "歡迎光臨我的部落格" + Environment.NewLine + a + " " + b; 
                };
            // Lambda表示式
            Func<string, string, string> func3 =
                (a, b) => { return "歡迎光臨我的部落格" + Environment.NewLine + a + " " + b; };

            // 呼叫Func委託
            string helloStr = func2("滴答的雨", @"http://www.cnblogs.com/heyuquan/");

            Console.WriteLine(helloStr);
	}
        static string Hello(string a, string b)
        {
            return "歡迎光臨我的部落格" + Environment.NewLine + a + " " + b; 
        }

3.擴充套件方法

1)擴充套件方法宣告在靜態類中,定義為一個靜態方法,其第一個引數需要使用this關鍵字標識,指示它所擴充套件的型別。

2)擴充套件方法可以將方法寫入最初沒有提供該方法的類中。還可以把方法新增到實現某個介面的任何類中,這樣多個類就可以使用相同的實現程式碼。(LINQ中,System.Linq.Queryable.csSystem.Linq.Enumerable.cs 正是對介面新增擴充套件方法)

3)擴充套件方法雖定義為一個靜態方法,但其呼叫時不必提供定義靜態方法的類名,只需引入對應的名稱空間,訪問方式同例項方法

4)擴充套件方法不能訪問它所擴充套件的型別的私有成員。

示例:

        public static IEnumerable<TSource> MyWhere<TSource>(
            this IEnumerable<TSource> source, Func<TSource, bool> predicate)
        {
            foreach (TSource item in source)
            {
                if (predicate(item))
                    yield return item;
            }
        }

4.Yield迭代器,延遲計算

1)Yield迭代器

在上面定義的MyWhere擴充套件方法中,我們使用了yield迭代器。使我們不必“顯示”實現IEnumerableIEnumerator介面。只需要簡單的使用 yield 關鍵字,由 JIT 編譯器幫我們編譯成實現 IEnumerableIEnumerator 介面的物件(即:本質還是傳統遍歷,只是寫法上非常簡潔),就能使用foreach進行遍歷。

請詳看:,通過這篇博文我們可以學會如何實現foreach遍歷以及foreach執行遍歷的詳細過程如下圖所示:

image

2)延遲計算(Lazy evaluation

a)定義:來源自函數語言程式設計,在函數語言程式設計裡,將函式作為引數來傳遞,傳遞過程中不會執行函式內部耗時的計算,直到需要這個計算結果的時候才呼叫,這樣就可以因為避免一些不必要的計算而改進效能。

b)Yield迭代器的延遲計算原理:JIT 編譯器會幫助我們將迭代主體編譯到IEnumerator.MoveNext()方法中。從上圖foreach的執行流程來看,迭代主體是在每次遍歷執行到 in 的時候才會呼叫MoveNext(),所以其迭代器耗時的指令是延遲計算的。

c)LINQ查詢的延遲計算原理:通過給LINQ擴充套件方法傳遞方法委託,作為yield迭代器的主體,讓遍歷執行到MoveNext()時才執行耗時的指令。

5.表示式樹

表示式樹:表示式樹允許在執行期間建立對資料來源的查詢,因為表示式樹儲存在程式集中。(後續在Linq to entities博文中與Queryable一起解說)

Language Integrated QueryLINQ,語言整合查詢)

image

從這幅圖中,我們可以知道LINQ包括五個部分:LINQ to ObjectsLINQ to XMLLINQ to SQLLINQ to DataSetLINQ to Entities

程式集

名稱空間

描述

LINQ to Objects

System.Core.dll

System.Linq

相關推薦

LinqLinq入門Linq to Objects

本博文詳細介紹 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,語言整合查詢)。通過LINQ,我們可以使用相同API操作不同的資料來源。接下來就讓我們看看LINQ是什麼以及如何使用? 再此之前,需要先了解的相關技術 1.隱式型別、匿名型別、

針對初學者的A*演算法入門附帶Java原始碼

      英文題目,漢語內容,有點掛羊頭賣狗肉的嫌疑,不過請不要打擊我這顆想學好英語的心。當了班主任我才發現大一18本書,11本是英語的,能多用兩句英語就多用,個人認為這樣也是積累的一種方法。      Thanks open source pioneers dedicated to computer s

Android ORM 框架GreenDao 使用進階篇

前言 一、複雜表結構 a, 使用 @ToOne 建立一對一 ( 1 : 1) 關係 @Entity public class Order { @Id private Long id; private lo

Spark 入門Spark RDD

RDD的容錯機制實現分散式資料集容錯方法有兩種:資料檢查點和記錄更新RDD採用記錄更新的方式:記錄所有更新點的成本很高。所以,RDD只支援粗顆粒變換,即只記錄單個塊上執行的單個操作,然後建立某個RDD的變換序列(血統)儲存下來;變換序列指,每個RDD都包含了他是如何由其他RDD變換過來的以及如何重建某一塊資料

OSPFOSPF LSA

ospf lsa詳解 forwarding address OSPF LSA詳解OSPF V2版本中常用的主要有6類LSA,分別是Router-LSA、Network-LSA、Network-summary-LSA、ASBR-summary-LSA、AS-External-LSA、NSSA-LSA,接

Vue入門一報錯 Unknown ... make sure to provide the "name" option及error compiling template

ont methods rect return tex exactly gist () 編譯 報錯一: Unknown custom element: <custom-select> - did you register the component correc

STLdeque用法

deque函式: deque容器為一個給定型別的元素進行線性處理,像向量一樣,它能夠快速地隨機訪問任一個元素,並且能夠高效地插入和刪除容器的尾部元素。但它又與vector不同,deque支援高效插入和刪除容器的頭部元素,因此也叫做雙端佇列。deque類常用的函式如下。

Android系列教程EditText使用-包含很多教程上看不到的功能演示

Android系列教程目錄: 一:新建HelloEditText工程 新建一個Hello world詳細步驟可以參見 建立設定如下: Project name:HelloEditTextBuild Target :android 2.2Application name

.Neter玩轉Linux系列crontab使用和Linux的程序管理以及網路狀態監控

基礎篇 實戰篇 一、crontab使用詳解  概述:任務排程:是指系統在某個時間執行的特定的命令或程式。 任務排程分類:       (1)系統工作:有些重要的工作必須周而 復始地執行。       (2)個別使用者工作:個別使用者可能希望執 行某些程式。

大資料入門基礎系列Hadoop1.X、Hadoop2.X和Hadoop3.X的多維度區別博主推薦

  不多說,直接上乾貨! 在前面的博文裡,我已經介紹了   見下面我寫的微信公眾號博文 歡迎大家,加入我的微信公眾號:大資料躺過的坑     免費給分享 同時,大家可以關注我的個人部

原創Jquery入門

1、JQuery概述:Jquery是繼prototype之後又一個優秀的Javascrīpt框架。它是輕量級的js庫(壓縮後只有21k) ,它相容CSS3,還相容各種瀏覽器(IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+)。jQuery使使用者能更方便地處理HTML doc

Linq連線兩個List列表 例項Linq inner join,left join

本章節主要介紹Linq的聯接運算,對兩個List< T >,分別 inner join 和 left join 聯接,以此為例,進行例項詳解,程式碼也是自己編寫,親測通過的,可以直接拿著當demo使用。 聯接是指將一個數據源物件與另一個數據源

大型網站架構系列負載均衡3

lte 子進程 變化 rewrite acc smtp alived 傳輸 操作 本次分享大綱 軟件負載均衡概述 Ngnix負載均衡 Lvs負載均衡 Haproxy負載均衡 本次分享總結 一、軟件負載均衡概述 硬件負載均衡性能優越,功能全面,但是價格昂貴,一般適合初期或

Android零基礎入門第80節Intent 屬性

gre save top log 單選按鈕 bar 手機 彩信 ttext 上一期學習了Intent的前三個屬性,本期接著學習其余四個屬性,以及Android系統常用內置組件的啟動。 四、Data和Type屬性 Data屬性通常用於向Action屬性提

PHP基礎入門【世界上最好用的編程語言】

轉換成 c語言 127.0.0.1 mac const 讀取 成對 後臺 isset 簡介 ---------  PHP(超文本預處器)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。PHP 獨

搜索引擎系列五Lucene索引IndexWriter、Document、索引更新

let integer 自己 textfield app tdi AS query rect 一、IndexWriter詳解 問題1:索引創建過程完成什麽事?     分詞、存儲到反向索引中 1. 回顧Lucene架構圖: 介紹我們編寫的應用程序要完成數據的收集,再將數據

搜索引擎系列八solr-部署solr兩種部署模式介紹、獨立服務器模式、SolrCloud分布式集群模式

nod 為什麽 用途 serve creat 復制 stand 數據 變量名 一、solr兩種部署模式介紹 Standalone Server 獨立服務器模式:適用於數據規模不大的場景 SolrCloud 分布式集群模式:適用於數據規模大,高可靠、高可用、高並發的場景 二

python 學習彙總27itertools函式 tcy

itertools函式 2018/11/14 2.1.建立新iter: count(start=0, step=1)#無限迴圈數;按Ctrl + C退出 # 返回均勻間隔值無限流;通常用作map()生成連續資料點的引數。此外,用於zip()新增序列號 g = itertools.count

Spark入門-Spark簡介

個人部落格原文連結 簡介 Spark是基於記憶體計算的大資料分散式計算框架。Spark基於記憶體計算,提供可互動查詢方式,提供近實時處理方式,同時保證了高容錯性和高可伸縮性,允許使用者將Spark部署在大量廉價硬體之上,形成叢集。 Spark使用Scala語言進行實現,它是一種面

Spring AOP AspectJ切入點語法最全面、最詳細。

6.5  AspectJ切入點語法詳解 6.5.1  Spring AOP支援的AspectJ切入點指示符        切入點指示符用來指示切入點表示式目的,,在spring AOP中目