第5章泛型與LINQ_第1頁
第5章泛型與LINQ_第2頁
第5章泛型與LINQ_第3頁
第5章泛型與LINQ_第4頁
第5章泛型與LINQ_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、教育部普通高等教育十二五國家級規(guī)劃教材教育部普通高等教育十二五國家級規(guī)劃教材C#程序設計及應用教程程序設計及應用教程第第3版版(包括簡化版:(包括簡化版:C#程序設計教程程序設計教程第第3版)版)第第5章章 泛型與泛型與LINQ2Ch5 泛型與泛型與LINQ5.1 C#的類型擴展的類型擴展5.2 泛型和泛型集合泛型和泛型集合5.3 LINQ查詢表達式查詢表達式5.4 Lambda表達式表達式5.5 LINQ to Objects35.1 C#的類型擴展的類型擴展lC#提供了一些非常實用的類型擴展功能。提供了一些非常實用的類型擴展功能。匿名類型和隱式類型的局部變量。匿名類型和隱式類型的局部變量。

2、var v = new ID = “0001”, Age = 18Console.WriteLine(“ID:0,年齡年齡:1”,v.ID, v.Age);l匿名類型和隱式類型的局部變量匿名類型和隱式類型的局部變量匿名類型將一組只讀屬性封裝到單個對象中,而無需首先顯式定匿名類型將一組只讀屬性封裝到單個對象中,而無需首先顯式定義一個類型。義一個類型。“字段字段”不能使用不能使用var來聲明來聲明。用用var聲明的聲明的“局部變量局部變量”不能為不能為null。45.1 C#的類型擴展的類型擴展lC#提供了一些非常實用的類型擴展功能。提供了一些非常實用的類型擴展功能。對象初始化和集合初始化對象初始

3、化和集合初始化class StudentInfo string Nameget;set;int Ageget;setStudentInfo si = new StudentInfo();si.Name = “張三張三”;si.Age = 20;/ 可以簡化為可以簡化為StudentInfo si=new StudentInfoName = “張三張三”;si.Age = 20 55.1 C#的類型擴展的類型擴展l對象初始化和集合初始化對象初始化和集合初始化在在C#中,創(chuàng)建一個對象時,可以用一條語句同時實現(xiàn)創(chuàng)建對象并中,創(chuàng)建一個對象時,可以用一條語句同時實現(xiàn)創(chuàng)建對象并對對象的一部分屬性或者全部屬

4、性進行初始化,而無需顯式調(diào)用對對象的一部分屬性或者全部屬性進行初始化,而無需顯式調(diào)用類型的構(gòu)造函數(shù)。類型的構(gòu)造函數(shù)。指定元素初始值設定項時,各個對象初始值設定項被分別括在大指定元素初始值設定項時,各個對象初始值設定項被分別括在大括號中,初始值之間用逗號分隔。括號中,初始值之間用逗號分隔。這種簡化用法的前提是集合必須實現(xiàn)這種簡化用法的前提是集合必須實現(xiàn)IEnumerable接口。接口。l【例例5-1】演示擴展類型的基本用法。演示擴展類型的基本用法。65.2 泛型和泛型集合泛型和泛型集合l集合是指一組組合在一起的性質(zhì)類似的類型化對象。集合是指一組組合在一起的性質(zhì)類似的類型化對象。l泛型集合是一種強

5、類型的集合,它能提供比非泛型集合好得多泛型集合是一種強類型的集合,它能提供比非泛型集合好得多的類型安全性和性能。的類型安全性和性能。75.2 泛型和泛型集合泛型和泛型集合常見的泛型集合類及對應的非泛型集合類常見的泛型集合類及對應的非泛型集合類泛型集合類非泛型集合類泛型集合用法舉例ListArrayListList dinosaurs = new List( );DictionaryHashtableDictionary d = new Dictionary( );d.Add (txt, notepad.exe);QueueQueueQueue q = new Queue( );q.Enqueu

6、e(one);StackStackStack s = new Stack( );s.Push(one); s.Pop( );SortedListSortedListSortedList list = new SortedList( );list.Add (txt, notepad.exe);list.TryGetValue(tif, out value)85.2 泛型和泛型集合泛型和泛型集合l泛型的定義和引用。泛型的定義和引用。泛型是指在類名后添加用尖括號括起來的類型參數(shù)列表來定義一泛型是指在類名后添加用尖括號括起來的類型參數(shù)列表來定義一組組“通用化通用化”的類型。的類型。泛型只需要定義一次就

7、能實現(xiàn)所有實際類型的調(diào)用。如果不使用泛型只需要定義一次就能實現(xiàn)所有實際類型的調(diào)用。如果不使用泛型,就只能針對不同的類型分別編寫對應的方法。泛型,就只能針對不同的類型分別編寫對應的方法。.NET框架提供框架提供了多種了多種常見泛型集合類常見泛型集合類。95.2 泛型和泛型集合泛型和泛型集合 public class Pairpublic T1 First; public T2 Second;105.2 泛型和泛型集合泛型和泛型集合l列表和排序列表列表和排序列表列表列表System.Collections.Generic.List表示可通過索引訪問表示可通過索引訪問的強類型對象列表,列表中可以有重

8、復的元素。的強類型對象列表,列表中可以有重復的元素。排序列表排序列表SortedList的用法和列表(的用法和列表(List)的用法相似,區(qū)別僅是排序列表是按鍵(的用法相似,區(qū)別僅是排序列表是按鍵(Key)進行升序排序的)進行升序排序的結(jié)果。結(jié)果。l【例例5-2】演示列表和排序列表的基本用法。演示列表和排序列表的基本用法。115.2 泛型和泛型集合泛型和泛型集合l鏈表鏈表LinkedList為雙向鏈表。為雙向鏈表。LinkedList對象中的每個節(jié)點對象中的每個節(jié)點都屬于都屬于LinkedListNode類型。每個節(jié)點又指向其類型。每個節(jié)點又指向其Next節(jié)點節(jié)點和和Previous節(jié)點。節(jié)點

9、?!纠?-3】 演示鏈表的基本用法。演示鏈表的基本用法。125.2 泛型和泛型集合泛型和泛型集合l字典和排序字典字典和排序字典Dictionary泛型類提供了一組泛型類提供了一組“鍵鍵/值值”對,字對,字典中的每項都由一個值及其相關(guān)聯(lián)的鍵組成,通過鍵可檢索值。典中的每項都由一個值及其相關(guān)聯(lián)的鍵組成,通過鍵可檢索值。一個字典中不能有重復的鍵。一個字典中不能有重復的鍵。Dictionary提供的常用方法如下。提供的常用方法如下。uAddAdd方法:將帶有指定鍵和值的元素添加到字典中。方法:將帶有指定鍵和值的元素添加到字典中。uTryGetValueTryGetValue方法:獲取與指定的鍵相關(guān)聯(lián)

10、的值。方法:獲取與指定的鍵相關(guān)聯(lián)的值。uContainsKeyContainsKey方法:確定字典中是否包含指定的鍵。方法:確定字典中是否包含指定的鍵。uRemoveRemove方法:從字典中移除帶有指定鍵的元素。方法:從字典中移除帶有指定鍵的元素。135.2 泛型和泛型集合泛型和泛型集合【例例5-4】 演示字典和排序字典的基本用法。演示字典和排序字典的基本用法。145.2 泛型和泛型集合泛型和泛型集合l隊列隊列Queue泛型類表示對象的先進先出集合。泛型類表示對象的先進先出集合。隊列可以保存隊列可以保存null值并且允許有重復的元素。值并且允許有重復的元素。常用方法如下。常用方法如下。uEn

11、queueEnqueue方法:將指定元素插入列尾。方法:將指定元素插入列尾。uDequeueDequeue方法:隊列首元素出列。方法:隊列首元素出列。155.2 泛型和泛型集合泛型和泛型集合【例例5-5】 演示隊列的基本用法。演示隊列的基本用法。165.2 泛型和泛型集合泛型和泛型集合l堆棧堆棧Stack泛型類表示同類型實例的大小可變的后進先出(泛型類表示同類型實例的大小可變的后進先出(LIFO)集合。)集合。堆??梢员4娑褩?梢员4鎛ull值并且允許有重復值值并且允許有重復值.常用方法如下常用方法如下:uPushPush方法:將指定元素插入棧頂。方法:將指定元素插入棧頂。uPopPop方法:

12、彈出棧頂元素。方法:彈出棧頂元素。175.2 泛型和泛型集合泛型和泛型集合l哈希表和哈希集合哈希表和哈希集合Hashtable類(哈希表)也是基于鍵返回值的算法,它通過調(diào)用類(哈希表)也是基于鍵返回值的算法,它通過調(diào)用GetHashCode方法為每個鍵生成對應的哈希值方法為每個鍵生成對應的哈希值。哈希集合(哈希集合(HashSet)與)與Hashtable不同,不同,HashSet是一個無序是一個無序集合,主要用于進行數(shù)學集合運算。集合,主要用于進行數(shù)學集合運算。HashSet泛型類比泛型類比HashSet的運行效率更高的運行效率更高。185.3 LINQ查詢表達式查詢表達式lLINQ是一組查

13、詢技術(shù)的統(tǒng)稱。是一組查詢技術(shù)的統(tǒng)稱。其主要思想是將各種查詢功能直接集成到其主要思想是將各種查詢功能直接集成到C#語言中,不論是對象、語言中,不論是對象、XML還是數(shù)據(jù)庫,都可以用還是數(shù)據(jù)庫,都可以用C#語法編寫查詢語句。語法編寫查詢語句。l與傳統(tǒng)的與傳統(tǒng)的foreach循環(huán)相比,循環(huán)相比,LINQ查詢具有以下優(yōu)勢:查詢具有以下優(yōu)勢:更簡明、更易讀,尤其在篩選多個條件時。更簡明、更易讀,尤其在篩選多個條件時。使用最少的應用程序代碼提供強大的篩選、排序和分組功能。使用最少的應用程序代碼提供強大的篩選、排序和分組功能。無需修改或只需做很小的修改即可將它們移植到其他數(shù)據(jù)源。無需修改或只需做很小的修改即

14、可將它們移植到其他數(shù)據(jù)源。操作越復雜操作越復雜,優(yōu)勢越明顯優(yōu)勢越明顯.195.3 LINQ查詢表達式查詢表達式l延遲執(zhí)行和立即執(zhí)行。延遲執(zhí)行和立即執(zhí)行。LINQ查詢表達式由一組類似于查詢表達式由一組類似于SQL的聲明性語法編寫的子句組的聲明性語法編寫的子句組成。成。所有所有LINQ查詢操作都由以下查詢操作都由以下3部分組成。部分組成。u獲取數(shù)據(jù)源。數(shù)據(jù)源可以是數(shù)組、獲取數(shù)據(jù)源。數(shù)據(jù)源可以是數(shù)組、XMLXML文件、文件、SQLSQL數(shù)據(jù)庫、集合等。數(shù)據(jù)庫、集合等。u創(chuàng)建查詢。定義查詢表達式,并將其保存到某個查詢變量中。查詢創(chuàng)建查詢。定義查詢表達式,并將其保存到某個查詢變量中。查詢變量本身并不執(zhí)行

15、任何操作并且不返回任何數(shù)據(jù),它只是存儲在以變量本身并不執(zhí)行任何操作并且不返回任何數(shù)據(jù),它只是存儲在以后某個時刻執(zhí)行查詢時為生成結(jié)果而必需的信息。后某個時刻執(zhí)行查詢時為生成結(jié)果而必需的信息。u執(zhí)行查詢。執(zhí)行查詢。205.3 LINQ查詢表達式查詢表達式l結(jié)構(gòu)組成結(jié)構(gòu)組成LINQ查詢表達式查詢表達式必須以必須以from子句開頭子句開頭,且必須以且必須以select或或group子句結(jié)尾子句結(jié)尾。from子句與子句與select或或group子句中間的查詢表達式可以包含一個子句中間的查詢表達式可以包含一個或多個或多個where,orderby,join,let甚至附加的甚至附加的from子句子句.還

16、可以使用還可以使用into將將join或或group子句的結(jié)果作為附加查詢子句的源數(shù)據(jù)子句的結(jié)果作為附加查詢子句的源數(shù)據(jù)。int num = 0,1,2,3,4,5,6;int num = 0,1,2,3,4,5,6;Var q = from n in numVar q = from n in num where n %2 = 0 where n %2 = 0 select n; select n;foreach (var v in q) foreach (var v in q) Console.WriteLine(“0”,v);Console.WriteLine(“0”,v); 215.3

17、LINQ查詢表達式查詢表達式lfrom子句子句from子句用于指定數(shù)據(jù)源和范圍變量。子句用于指定數(shù)據(jù)源和范圍變量。查詢表達式必須以查詢表達式必須以from子句開頭。子句開頭?!纠?-6】 演示演示from子句的基本用法。子句的基本用法。225.3 LINQ查詢表達式查詢表達式lwhere子句子句where子句用于指定篩選條件,即只返回篩選表達式結(jié)果為子句用于指定篩選條件,即只返回篩選表達式結(jié)果為true的元素。的元素?!纠?-7】演示演示where子句的基本用法。子句的基本用法。235.3 LINQ查詢表達式查詢表達式lorderby子句子句orderby子句用于對返回的結(jié)果進行排序,子句

18、用于對返回的結(jié)果進行排序,ascending關(guān)鍵字表關(guān)鍵字表示升序,示升序,descending關(guān)鍵字表示降序。關(guān)鍵字表示降序。【例例5-8】演示演示orderby子句的基本用法。子句的基本用法。245.3 LINQ查詢表達式查詢表達式lgroup子句子句group子句用于按指定的鍵分組,子句用于按指定的鍵分組,group后面可以用后面可以用by指定分組指定分組的鍵。的鍵。通常情況下通常情況下,group子句放在查詢表達式的最后子句放在查詢表達式的最后.【例例5-9】 演示演示group子句的基本用法。子句的基本用法。255.3 LINQ查詢表達式查詢表達式lselect子句子句select子

19、句用于生成查詢結(jié)果并指定每個返回的元素的子句用于生成查詢結(jié)果并指定每個返回的元素的“形狀形狀”或或“類型類型”。可以用可以用select子句讓范圍變量只包含成員的子集子句讓范圍變量只包含成員的子集。當當select子句生成除源元素副本以外的內(nèi)容時,該操作稱為子句生成除源元素副本以外的內(nèi)容時,該操作稱為“投投影影”?!纠?-10】演示演示select子句的基本用法。子句的基本用法。265.3 LINQ查詢表達式查詢表達式l查詢多個對象查詢多個對象利用利用LINQ的的from子句也可以直接查詢多個對象,唯一的要求是子句也可以直接查詢多個對象,唯一的要求是每個對象中的成員需要至少有一個與其他成員關(guān)

20、聯(lián)的元素。每個對象中的成員需要至少有一個與其他成員關(guān)聯(lián)的元素?!纠?-11】 演示如何用演示如何用LINQ查詢學生及其家庭成員的信息。查詢學生及其家庭成員的信息。275.4 Lambda表達式表達式lLambda表達式表達式Lambda表達式主要用于簡化委托的代碼編寫形式。表達式主要用于簡化委托的代碼編寫形式。在在LINQ中,使用中,使用Lambda表達式可以使編寫的代碼更加簡潔高效。表達式可以使編寫的代碼更加簡潔高效。lLambda表達式的基本用法表達式的基本用法Lambda表達式是一個可用于創(chuàng)建委托或表達式樹類型的匿名函表達式是一個可用于創(chuàng)建委托或表達式樹類型的匿名函數(shù)。數(shù)。u語法為語法為 ( (輸入?yún)?shù)列表輸入?yún)?shù)列表)=)=表達式或語句塊表達式或語句塊 u所有所有LambdaLambda表達式都使

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論