成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

LINQ中延時執行的Enumerable類方法成員

開發 后端
LINQ標準查詢運算法是依靠一組擴展方法來實現的。而這些擴展方法分別在System.Linq.Enumerable和System.Linq.Queryable這連個靜態類中定義。

Enumerable的擴展方法采用線性流程,每個運算法會被線性執行。這種執行方法如果操作類似關系型數據庫數據源,效率會非常低下,所以Queryable重新定義這些擴展方法,把LINQ表達式拆解為表達式樹,提供程序就可以根據表達式樹生成關系型數據庫的查詢語句,即SQL命令,然后進行相關操作。

  每個查詢運算符的執行行為不同,大致分為立即執行和延時執行。延時執行的運算符將在枚舉元素的時候被執行。

  Enumerable類位于程序集System.Core.dll中,System.Linq命名空間下,并且直接集成自System.Object,存在于3.5及以上的.NET框架中。Enumerable是靜態類,不能實例化和被繼承,其成員只有一組靜態和擴展方法。

  LINQ不僅能夠查詢實現IEnumerable<T>或IQueryable<T>的類型,也能查詢實現IEnumerable接口的類型。關于Enumerable方法的詳細說明,請參考MSDN  Enumerable 類

  理解LINQ首先必須理解擴展方法

  msdn是這樣規定擴展方法的:“擴展方法被定義為靜態方法,但它們是通過實例方法語法進行調用的。 它們的***個參數指定該方法作用于哪個類型,并且該參數以 this 修飾符為前綴。”

下面給個擴展方法的例子如下:

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5.  
  6. namespace 擴展方法 
  7.     /// <summary> 
  8.     /// 為string類型定義一個擴展方法 
  9.     /// </summary> 
  10.     static class Helper 
  11.     {  
  12.         public static string MyExtenMethod(this string s) 
  13.         { 
  14.             return s.Substring(0, 2); 
  15.         } 
  16.     } 
  17.     class Program 
  18.     { 
  19.         static void Main(string[] args) 
  20.         { 
  21.             string s = "擴展方法示例"
  22.             Console.WriteLine(s.MyExtenMethod());//調用 
  23.             Console.ReadKey(false); 
  24.         } 
  25.     } 

程序的運行結果如下:

 -----插曲,想到了就加進來,有助于理解開頭的幾段話及LINQ原理

 ---------------------------------------------------------------”

 為了方便理解和記憶,DebugLZQ將常用的延時執行的Enumerable類方法成員分了下組,具體如下:

1.Take用于從一個序列的開頭返回指定數量的元素

2.TakeWhile 用于獲取指定序列從頭開始符合條件的元素,直到遇到不符合條件的元素為止

3.Skip跳過序列中指定數量的元素

4.SkipWhile 用于跳過序列總滿足條件的元素,然會返回剩下的元素

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5.  
  6. namespace 延時執行的Enumerable類方法 
  7.     /// <summary> 
  8.     /// 延時執行的Enumerable類方法 
  9.     /// DebugLZQ 
  10.     /// http://www.cnblogs.com/DebugLZQ 
  11.     /// </summary> 
  12.     class Program 
  13.     { 
  14.         static void Main(string[] args) 
  15.         { 
  16.             string[] names = { "DebugLZQ","DebugMan","Sarah","Jerry","Tom","Linda","M&M","Jeffery"}; 
  17.             //1.Take用于從一個序列的開頭返回指定數量的元素 
  18.             // 
  19.             //a.在數組上直接使用Take方法 
  20.             foreach (string name in names.Take(3)) 
  21.             { 
  22.                 Console.Write("{0}    ", name);  
  23.             } 
  24.             Console.WriteLine(); 
  25.             Console.WriteLine("-----"); 
  26.             //b.在LINQ返回的IEnumerable<T>序列上使用Take方法 
  27.             var query = from string name in names 
  28.                         where name.Length <=3 
  29.                         select name; 
  30.             foreach (string  name in query.Take(1)) 
  31.             { 
  32.                 Console.Write("{0}    ",name); 
  33.             } 
  34.             Console.WriteLine(); 
  35.             Console.WriteLine("----------------------------"); 
  36.             Console.ReadKey(false); 
  37.             //2.TakeWhile 用于獲取指定序列從頭開始符合條件的元素,直到遇到不符合條件的元素為止 
  38.             // 
  39.             var takenames = names.TakeWhile(n => n.Length>4); 
  40.             var takenames2 = names.TakeWhile((n,i)=>n.Length<10&&i<3); 
  41.             foreach (string name in takenames) 
  42.             { 
  43.                 Console.Write("{0}    ", name); 
  44.             } 
  45.             Console.WriteLine(); 
  46.             Console.WriteLine("-----"); 
  47.             foreach (string name in takenames2) 
  48.             { 
  49.                 Console.Write("{0}    ", name); 
  50.             } 
  51.             Console.WriteLine(); 
  52.             Console.WriteLine("----------------------------"); 
  53.             Console.ReadKey(false); 
  54.             //3.Skip跳過序列中指定數量的元素 
  55.             // 
  56.             foreach (string name in names.Skip(5)) 
  57.             { 
  58.                 Console.Write("{0}    ", name); 
  59.             } 
  60.             Console.WriteLine(); 
  61.             Console.WriteLine("-----"); 
  62.             var query_skip = (from name in names 
  63.                               where name.Length >= 3 
  64.                               select name).Skip(2); 
  65.             foreach (string name in query_skip.Skip(2) ) 
  66.             { 
  67.                 Console.Write("{0}    ", name); 
  68.             } 
  69.             Console.WriteLine(); 
  70.             Console.WriteLine("----------------------------"); 
  71.             Console.ReadKey(false); 
  72.             //4.SkipWhile 用于跳過序列總滿足條件的元素,然會返回剩下的元素 
  73.             //跳過名字長度大于3的 
  74.             var takenames_SkipWhile = names.SkipWhile(n => n.Length >3); 
  75.             foreach (string name in takenames_SkipWhile) 
  76.             { 
  77.                 Console.Write("{0}    ", name); 
  78.             } 
  79.             Console.WriteLine(); 
  80.             Console.WriteLine("-----"); 
  81.             var takenames_SkipWhile2 = names.SkipWhile((n,i)=>n.Length>3&&i>2); 
  82.             foreach (string name in takenames_SkipWhile2) 
  83.             { 
  84.                 Console.Write("{0}    ", name); 
  85.             } 
  86.             Console.WriteLine(); 
  87.             Console.WriteLine("----------------------------"); 
  88.             Console.ReadKey(false); 
  89.  
  90.             //小結Take、Skip獲得第N到第M個元素 
  91.             var names_TakeAndSkip = names.Skip(5).Take(3); 
  92.  
  93.             var names_TakeAndSkip2 = (from name in names 
  94.                                       select name).Skip(5).Take(3); 
  95.  
  96.             foreach (string name in names_TakeAndSkip) 
  97.             { 
  98.                 Console.Write("{0}    ", name); 
  99.             } 
  100.             Console.WriteLine(); 
  101.             Console.WriteLine("-----"); 
  102.             foreach (string name in names_TakeAndSkip2) 
  103.             { 
  104.                 Console.Write("{0}    ", name); 
  105.             } 
  106.             Console.WriteLine(); 
  107.             Console.WriteLine("----------------------------"); 
  108.             Console.ReadKey(false); 
  109.  
  110.         } 
  111.     } 

程序中有詳細的注釋不再多做說明,程序運行結果如下:

5.Reverse用于翻轉序列中的元素的順序

6.Distinct過濾掉重復的元素

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5.  
  6. namespace Reverse_Distinct等 
  7.     /// <summary> 
  8.     /// DebugLZQ 
  9.     /// http://www.cnblogs.com/DebugLZQ 
  10.     /// </summary> 
  11.     class Program 
  12.     { 
  13.         static void Main(string[] args) 
  14.         { 
  15.             string[] names = { "DebugLZQ""Jerry""Sarah""Jerry""Tom""Linda""M&M""Jeffery" }; 
  16.             //5.Reverse用于翻轉序列中的元素的順序 
  17.            string str = "反轉字符串"
  18.  
  19.            var strre = str.ToCharArray().Reverse(); 
  20.            var takenames = names.Reverse(); 
  21.  
  22.            foreach (var c in strre) 
  23.            { 
  24.                Console.Write(c); 
  25.            } 
  26.            Console.WriteLine(); 
  27.            Console.WriteLine("-----"); 
  28.            foreach (var c in takenames ) 
  29.            { 
  30.                Console.WriteLine(c); 
  31.            } 
  32.            Console.WriteLine("----------------------------"); 
  33.            Console.ReadKey(false); 
  34.  
  35.             //6.Distinct  過濾掉重復的元素 
  36.            var takenames_Distinct = names.Distinct(); 
  37.  
  38.            foreach (var c in takenames_Distinct) 
  39.            { 
  40.                Console.WriteLine(c); 
  41.            } 
  42.            Console.WriteLine("----------------------------"); 
  43.            Console.ReadKey(false); 
  44.         } 
  45.     } 

程序的運行結果如下:

7.Union用于合并兩個序列,并去掉重復項

8.Concat用于連接兩個序列,不會去掉重復項

9.Intersect用于獲得連個序列的交集

10.Except用于獲得兩個結合的差集

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5.  
  6. namespace Union_Concat_Intersect_Except 
  7.     /// <summary> 
  8.     /// DebugLZQ 
  9.     /// http://www.cnblogs.com/DebugLZQ 
  10.     /// </summary> 
  11.     class Program 
  12.     { 
  13.         static void Main(string[] args) 
  14.         { 
  15.             string[] names1 = { "DebugLZQ""Jerry""Sarah""Jerry""Tom""Linda""M&M""Jeffery" }; 
  16.             string[] names2 = { "DebugLZQ""Jerry""Sarah" }; 
  17.  
  18.             //7.Union用于合并兩個序列,并去掉重復項 
  19.             var names_Union = names1.Union(names2); 
  20.  
  21.             //8.Concat用于連接兩個序列,不會去掉重復項 
  22.             var names_Concat = names1.Concat(names2); 
  23.  
  24.             //9.Intersect用于獲得連個序列的交集 
  25.             var names_Intersect = names1.Intersect(names2); 
  26.  
  27.             //10.Except用于獲得兩個結合的差集 
  28.             var names_Except = names1.Except(names2); 
  29.  
  30.             foreach (string name in names_Union) 
  31.             { 
  32.                 Console.WriteLine(name); 
  33.             } 
  34.             Console.WriteLine("-----"); 
  35.             Console.ReadKey(false); 
  36.             foreach (string name in names_Concat) 
  37.             { 
  38.                 Console.WriteLine(name); 
  39.             } 
  40.             Console.WriteLine("-----"); 
  41.             Console.ReadKey(false); 
  42.             foreach (string name in names_Intersect) 
  43.             { 
  44.                 Console.WriteLine(name); 
  45.             } 
  46.             Console.WriteLine("-----"); 
  47.             Console.ReadKey(false); 
  48.             foreach (string name in names_Except) 
  49.             { 
  50.                 Console.WriteLine(name); 
  51.             } 
  52.             Console.WriteLine("-----"); 
  53.             Console.ReadKey(false); 
  54.         } 
  55.     } 

程序的運行結果如下:

11.Range 用于生成指定范圍內的“整數”序列

12.Repeat用于生成指定數量的重復元素

13.Empty 用于獲得一個指定類型的空序列

14.DefaultIfEmpty 用于獲得序列,如果為空,則添加一個默認類型元素

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5.  
  6. namespace Range_Empty_DefalultIfEmpty 
  7.     /// <summary> 
  8.     /// DebugLZQ 
  9.     /// http://www.cnblogs.com/DebugLZQ 
  10.     /// </summary> 
  11.     class Program 
  12.     { 
  13.         static void Main(string[] args) 
  14.         { 
  15.             //11.Range 用于生成指定范圍內的“整數”序列 
  16.             var num2 = Enumerable.Range(10, 15); 
  17.  
  18.             //12.Repeat用于生成指定數量的重復元素 
  19.             var guest = new {Name="橙子",Age=25 }; 
  20.             var Guests = Enumerable.Repeat(guest, 5); 
  21.  
  22.             //13.Empty 用于獲得一個指定類型的空序列 
  23.             var empty = Enumerable.Empty<string>(); 
  24.  
  25.             //14.DefaultIfEmpty 用于獲得序列,如果為空,則添加一個默認類型元素 
  26.             //a 
  27.             var intempty = Enumerable.Empty<int>(); 
  28.             Console.WriteLine(intempty.Count()); 
  29.             Console.WriteLine("-----------"); 
  30.             foreach (var n in intempty) 
  31.             { 
  32.                 Console.WriteLine(n);             
  33.             } 
  34.             Console.WriteLine("-----------"); 
  35.             Console.WriteLine(intempty.DefaultIfEmpty().Count()); 
  36.             Console.WriteLine("-----------"); 
  37.             foreach (var n in intempty.DefaultIfEmpty()) 
  38.             { 
  39.                 Console.WriteLine(n); 
  40.             } 
  41.             Console.WriteLine("--------------------------"); 
  42.             Console.ReadKey(false); 
  43.             //b 
  44.             string[] names = { "DebugLZQ""DebugMan""Sarah""Jerry""Tom""Linda""M&M""Jeffery" }; 
  45.             var query = from name in names 
  46.                         where name == "LBJ" 
  47.                         select name; 
  48.             Console.WriteLine(query.Count()); 
  49.             Console.WriteLine(query.DefaultIfEmpty().Count());//默認為null 
  50.             foreach (var n in query.DefaultIfEmpty()) 
  51.             { 
  52.                 Console.WriteLine(n); 
  53.             } 
  54.             Console.WriteLine("---------------"); 
  55.             Console.ReadKey(false); 
  56.             //c指定一個默認值 
  57.             foreach (var n in intempty.DefaultIfEmpty(100)) 
  58.             { 
  59.                 Console.WriteLine(n); 
  60.             } 
  61.             Console.WriteLine("--------------------------"); 
  62.             Console.ReadKey(false); 
  63.  
  64.             foreach (var n in query.DefaultIfEmpty("James")) 
  65.             { 
  66.                 Console.WriteLine(n); 
  67.             } 
  68.             Console.ReadKey(false); 
  69.         } 
  70.     } 

程序的運行結果如下:

15.OfType篩選指定類型的元素

16.Cast類型轉換

17.AsEnumerable有些數據源類型不支持Enumerable的部分查詢關鍵字,需要轉換下,譬如IQueryable

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5. using System.Collections; 
  6.  
  7. namespace Cast_OfType_AsEnumerable 
  8.     /// <summary> 
  9.     /// DebugLZQ 
  10.     /// http://www.cnblogs.com/DebugLZQ 
  11.     /// </summary> 
  12.     class Program 
  13.     { 
  14.         static void Main(string[] args) 
  15.         { 
  16.             ArrayList names = new ArrayList(); 
  17.             names.Add("DebugLZQ"); 
  18.             names.Add("Jerry"); 
  19.             names.Add(100); 
  20.             names.Add(new {Name="LZQ",Age=26}); 
  21.             names.Add(new Stack()); 
  22.             //15.OfType篩選指定類型的元素 
  23.             var takenames = names.OfType<string>(); 
  24.  
  25.             //16.Cast類型轉換 
  26.             var takenames2 = names.OfType<string>().Cast<string>(); 
  27.  
  28.             //17.AsEnumerable 
  29.             var takenames3 = takenames2.AsEnumerable(); 
  30.  
  31.             foreach (var name in takenames3) 
  32.             { 
  33.                 Console.Write("{0}  ",name); 
  34.             } 
  35.             Console.ReadKey(false); 
  36.  
  37.         } 
  38.     } 

程序運行結果如下:

 延時執行,顧名思義就是不是立即執行,即不是在查詢語句定義的時候執行,而是在處理結果集(如遍歷)的時候執行,在Enumerable類方法成員中,除了本節總結的這常用的17個外,前面博文---LINQ基本子句 中總結的8個基本子句也都是延時執行的。注意延時執行的查詢程序的執行流程。

原文鏈接:http://www.cnblogs.com/DebugLZQ/archive/2012/11/08/2759543.html

【編輯推薦】

  1. Linq to xml操作XML
  2. XML之父解讀未來互聯網"游戲化"的三個真諦
  3. Ajax和Web服務數據格式:XML SOAP HTML
  4. 超強解析XML——簡單直接的來
  5. 解析PHP中的XML數據

 

責任編輯:彭凡 來源: 博客園
相關推薦

2009-09-16 17:41:56

Linq延時執行

2024-04-02 11:34:09

成員對象封閉類C++

2009-08-18 17:39:16

Enumerable.

2009-09-15 17:16:58

LINQ查詢操作符

2009-09-11 15:12:26

LINQ執行存儲過程

2024-02-22 18:07:17

C++靜態成員代碼

2009-09-16 10:27:35

LINQ Custom

2009-08-13 17:06:37

C#擴展方法Enumerable.

2009-08-27 13:56:03

IEnumerable

2009-09-14 10:35:15

Linq內部執行原理

2010-02-01 17:31:06

C++類成員

2012-09-18 09:39:57

Linq項目高效

2009-09-14 16:41:23

LINQ To XML

2009-09-09 13:18:26

Linq Submit

2009-09-09 09:59:08

Linq調用LoadP

2024-06-03 08:26:34

Android開發監聽器

2009-09-15 13:20:34

LINQ DataCo

2010-06-03 08:55:43

LINQ

2009-09-10 09:35:25

Linq語句

2009-09-17 08:47:00

Linq插入數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久国 | 国产亚洲欧美日韩精品一区二区三区 | 久久剧场 | www.久久久| 成人欧美一区二区三区在线播放 | 亚洲精品视频久久 | 91久久精品一区二区二区 | 911精品美国片911久久久 | 欧美a级成人淫片免费看 | 亚洲精品免费视频 | 在线免费观看a级片 | 欧美多人在线 | 日韩一区二区三区在线 | 日韩电影一区二区三区 | 国产免费观看一区 | 国产日韩免费观看 | 亚洲精品电影在线观看 | 毛片a区 | 欧美成人视屏 | 亚洲精品日本 | 国产成人99 | 欧美性生交大片免费 | 激情福利视频 | 日日操操 | 日韩1区2区 | www.久久.com | 特级生活片 | 久久久91精品国产一区二区三区 | 麻豆国产精品777777在线 | 一区中文字幕 | 美女国内精品自产拍在线播放 | 午夜视频在线观看网址 | 尤物视频在线免费观看 | 欧美一区二区三区在线播放 | 中文字幕第二十页 | 国产美女精品 | 日韩欧美在线一区二区 | cao视频| 国产午夜一级 | 日本一区二区三区在线观看 | 精品一区二区在线看 |