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类只是我的工具类,含有很多静态方法,方便输出迭代数据等。
浙公网安备 33010602011771号