linq查询内部实现初探

 1 //详见c#与.net3.5高级程序设计(4th)P367
 2 //linq查询表达式的内部表示:linq---lambda---匿名方法---委托。由表向内,由简向繁,但我们只要写上层的linq就可以了,编译器会为我们翻译的。如果想看编译后的底层源/码,要用Reflector的.net2.0或1.0打开就可以看到最底层的匿名方法,委托
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Linq;
 6 using System.Text;
 7 
 8 using CommTools;
 9 
12 namespace Linq_Test
13 {
14     public class Car
15     {
16         public string name;
17         public string color;
18     }
19     class Program
20     {
21         static void Main(string[] args)
22         {
23             //OutPutData.OutputParams(ExtensionMethods.IsBetween(0, 1, 3));
24             #region linq底层原理
25             string[] arr = { "morning", "aaaa", "bbbbbbbbb", "cc", "1111" };
26 
27             //1.linq查询运算符
28             //var subset = from g in arr where g.Length > 6 orderby g select g;
29 
30             //深层:2.lambda表达式
31             //var subset = arr.Where(game => game.Length > 6).OrderBy(game => game)    
32             //    .Select(game => game);
33             #region 扩展方法的另一种调用形式
34             //var subset =Enumerable.Where(arr,game=>game.Length>6).OrderBy(game=>game.Length)    
35             //    .Select(game => game);
36             #endregion
37 
38             //更深层:3.使用Enumerable类型和匿名方法来建立查询表达式
39             //Func<string, bool> searchFilter = delegate(string game) { return game.Length > 6; };
40             //Func<string, string> itemToProcess = delegate(string game) { return game; };
41             //var subset = arr.Where(searchFilter).OrderBy(itemToProcess).Select(itemToProcess);
42             
43             //更深层:4.使用Enumerable类型和原始代理建立查询查询表达式
44             //只需调用方法,不必再写lambda表达式.可以重用方法
45             Func<string, bool> searchFilter = new Func<string, bool>(Filter);
46             Func<string, string> itemToProcess = new Func<string, string>(new Program().ProcessItem);
47             var subset = arr.Where(searchFilter).OrderBy(itemToProcess).Select(itemToProcess);
48 
49             OutPutData.OutputEnumable(subset);
50 
51             //其他例子
52             string[] arr2 = { "1234", "123456", "12345678" };
53             Func<string, int, bool> searchFilterByNum = new Func<string, int, bool>(FilterNum);
54             //本想实现筛选出规定字符串长度的序列,发现不行。因为Where()中的int参数只能取到索引,而非可以手动赋参
55             //var subset2 = arr2.Where(searchFilterByNum).OrderBy(itemToProcess).Select(itemToProcess);
56             //暂时我只能想到foreach迭代判断的方法。不知有人有办法吗?!
57             foreach (var item in arr2)
58             {
59                 if (searchFilterByNum(item, 6))
60                     OutPutData.OutputParams(item);
61             }
62             #endregion
63 
64             Console.Read();
65         }
66 
67         public static bool Filter(string str)
68         {
69             return str.Length > 6;
70         }
71         public string ProcessItem(string str)
72         {
73             return str;
74         }
75 
76         public static bool FilterNum(string str,int minLen)
77         {
78             return str.Length > minLen;
79         }
80         
81     }
82 }

Commtools.OutPutData类只是我的工具类,含有很多静态方法,方便输出迭代数据等。

posted on 2014-01-11 17:09  nlh774  阅读(387)  评论(0)    收藏  举报