一:什麼是Lambda表達式sql
lambda表達式是實例化委託的一個參數,就是一個方法,具體實現以下:小程序
1 { 2 //.NetFramework 1.0-1.1的時候這樣應用 3 NoReturnNoPara method = new NoReturnNoPara(DoNothing); 4 method.Invoke(); 5 6 7 //.NetFramwork2.0 匿名方法出現,delegate關鍵字,能夠訪問局部變量 8 int i = 0; 9 NoReturnWithPara method1 = new NoReturnWithPara(delegate (int id, int age) 10 { 11 Console.WriteLine(i); 12 Console.WriteLine($"{id} 今年{age}歲了!"); 13 }); 14 method1.Invoke(1, 30); 15 16 17 //.NetFramwork3.0 把delegate關鍵字去掉,而後增長了一個箭頭goes to 18 //lambda表達式:參數列表=>方法體 19 NoReturnWithPara method2 = new NoReturnWithPara((int id, int age) => 20 { 21 Console.WriteLine(i); 22 Console.WriteLine($"{id} 今年{age}歲了!"); 23 }); 24 method2.Invoke(1, 30); 25 26 NoReturnWithPara method3 = new NoReturnWithPara((id, age) => 27 { //省略參數類型,可是編譯器能夠根據委託推斷出類型,是語法糖 28 Console.WriteLine(i); 29 Console.WriteLine($"{id} 今年{age}歲了!"); 30 }); 31 method3.Invoke(1, 30); 32 33 //若是方法體只有一行,能夠去掉大括號和分號 34 NoReturnWithPara method4 = new NoReturnWithPara((id, age) => Console.WriteLine($"{id} 今年{age}歲了!")); 35 method4.Invoke(1, 30); 36 37 //若是方法體只有一行,能夠去掉大括號和分號,還能夠去掉new NoReturnWithPara,這個也是編譯器語法糖 38 NoReturnWithPara method5 = (id, age) => Console.WriteLine($"{id} 今年{age}歲了!"); 39 method4.Invoke(1, 30); 40 41 //下面帶有返回值的 42 Func<int> func0 = () => { return DateTime.Now.Month; };//有一個返回值 43 Func<int> func1 = () => DateTime.Now.Month; //若是方法體只有一行,去掉大括號分號和return 44 45 }
使用反編譯工具看會產生一個私有sealed類,而後會看到lambda表達式都會生成一個方法名字,而後都會在包括在Sealed類裏面微信小程序
二:匿名類(.netFramwork3.0)微信
匿名類是.netFramwork3.0出現的,語法是:object object=new{};ide
下面有幾種聲明方式:工具
1 object model = new//3.0 2 { 3 Id = 2, 4 Name = "undefined", 5 Age = 25, 6 ClassId = 2 7 }; 8 // Console.WriteLine(model.Id);//object 編譯器不容許 9 10 var varModel = new//3.0 編譯後是有一個真實的類 11 { 12 Id = 2, 13 Name = "undefined", 14 Age = 25, 15 ClassId = 2 16 }; 17 Console.WriteLine(varModel.Id); //編譯器能夠找到 18 //varModel.Id = 123;//只能get 沒有set 19 //反射能夠找到 20 21 22 //dynamic避開編譯器 23 dynamic dModel = new//4.0 24 { 25 Id = 2, 26 Name = "undefined", 27 Age = 25, 28 ClassId = 2 29 }; 30 31 var s = dModel;
下面說一下var這個類型ui
var:是一個語法糖,由編譯器自動推算出變量的類型,通常配合匿名類型使用,而後如遇到複雜類型,能夠用之代替,但使用時,如下幾點須要注意:this
1:var聲明的時候必定要肯定類型,好比var dd=null或者var aa; 都是編譯不經過的spa
2:一旦肯定類型後是不能修改類型的,好比: var s = "加菲貓";則後面不能修改成:s=122;.net
三:擴展方法(.netFramwork3.0)
什麼是擴展方法?答案則是靜態類裏面的靜態方法,第一個參數類型前面加上this
具體以下:
1 public static class ExtendMethod 2 { 3 public static void Show<T>(this T t)//最好加約束 4 { } 5 6 public static void Sing(this Student student) 7 { 8 Console.WriteLine($"{student.Name} Sing a Song"); 9 } 10 11 /// <summary> 12 /// null默認是defaultValue,默認是0 13 /// </summary> 14 /// <param name="iValue"></param> 15 /// <param name="defaultValue"></param> 16 /// <returns></returns> 17 public static int ToInt(this int? iValue, int defaultValue = 0) 18 { 19 return iValue ?? defaultValue; 20 } 21 22 public static bool Than(this int value1, int value2) 23 { 24 return value1 > value2; 25 } 26 27 28 /// <summary> 29 /// 擴展基類型,致使任何子類都有這個方法,並且還可能被覆蓋啥的 30 /// </summary> 31 /// <param name="iValue"></param> 32 /// <returns></returns> 33 public static int Length(this object oValue) 34 { 35 return oValue == null ? 0 : oValue.ToString().Length; 36 } 37 38 }
而後調用的時候以下:
int? iValue1 = nul int? iValue = 2; iValue1.ToInt(); iValue1.Length(); s.Length(); 123.Than(234);
擴展方法的用途:
1:適合用於一些不常常修改的地方
2:適合組件式開發的擴展(.netcore),定義接口或者類,是按照最小需求,可是開發的時候又常常須要一些方法,就是經過擴展方法,context.Response.WriteAsync
還有中間件的註冊
3:擴展一些常見操做
擴展方法缺陷:優先調用類型的實例方法(有隱患),會污染基礎類型,通常少爲object 或者沒有約束的泛型去擴展,擴展基類型,致使任何子類都有這個方法,並且還可能被覆蓋啥的
三:linq
linq和lamda的關係:
lambda和linq的關係
lambda:是實例化委託的快捷方式,是一個方法
linq:是基於委託(lambda)的封裝,代碼重用,邏輯解耦,是一個幫助類庫
linq是用泛型,委託,lamda實現的,總的來講:把對數據操做的通用部分完成,把可變的交給委託,使用者只關心可變部分。
咱們仍是以例子來說,先初始化一些基礎數據
1 private List<Student> GetStudentList() 2 { 3 #region 初始化數據 4 List<Student> studentList = new List<Student>() 5 { 6 new Student() 7 { 8 Id=1, 9 Name="趙亮", 10 ClassId=2, 11 Age=35 12 }, 13 new Student() 14 { 15 Id=1, 16 Name="再努力一點", 17 ClassId=2, 18 Age=23 19 }, 20 new Student() 21 { 22 Id=1, 23 Name="王炸", 24 ClassId=2, 25 Age=27 26 }, 27 new Student() 28 { 29 Id=1, 30 Name="瘋子科學家", 31 ClassId=2, 32 Age=26 33 }, 34 new Student() 35 { 36 Id=1, 37 Name="滅", 38 ClassId=2, 39 Age=25 40 }, 41 new Student() 42 { 43 Id=1, 44 Name="黑騎士", 45 ClassId=2, 46 Age=24 47 }, 48 new Student() 49 { 50 Id=1, 51 Name="故鄉的風", 52 ClassId=2, 53 Age=21 54 }, 55 new Student() 56 { 57 Id=1, 58 Name="晴天", 59 ClassId=2, 60 Age=22 61 }, 62 new Student() 63 { 64 Id=1, 65 Name="旭光", 66 ClassId=2, 67 Age=34 68 }, 69 new Student() 70 { 71 Id=1, 72 Name="oldkwok", 73 ClassId=2, 74 Age=30 75 }, 76 new Student() 77 { 78 Id=1, 79 Name="樂兒", 80 ClassId=2, 81 Age=30 82 }, 83 new Student() 84 { 85 Id=1, 86 Name="暴風輕語", 87 ClassId=2, 88 Age=30 89 }, 90 new Student() 91 { 92 Id=1, 93 Name="一我的的孤單", 94 ClassId=2, 95 Age=28 96 }, 97 new Student() 98 { 99 Id=1, 100 Name="小張", 101 ClassId=2, 102 Age=30 103 }, 104 new Student() 105 { 106 Id=3, 107 Name="阿亮", 108 ClassId=3, 109 Age=30 110 }, 111 new Student() 112 { 113 Id=4, 114 Name="37度", 115 ClassId=4, 116 Age=30 117 } 118 , 119 new Student() 120 { 121 Id=4, 122 Name="關耳", 123 ClassId=4, 124 Age=30 125 } 126 , 127 new Student() 128 { 129 Id=4, 130 Name="耳機俠", 131 ClassId=4, 132 Age=30 133 }, 134 new Student() 135 { 136 Id=4, 137 Name="Wheat", 138 ClassId=4, 139 Age=30 140 }, 141 new Student() 142 { 143 Id=4, 144 Name="Heaven", 145 ClassId=4, 146 Age=22 147 }, 148 new Student() 149 { 150 Id=4, 151 Name="等待你的微笑", 152 ClassId=4, 153 Age=23 154 }, 155 new Student() 156 { 157 Id=4, 158 Name="暢", 159 ClassId=4, 160 Age=25 161 }, 162 new Student() 163 { 164 Id=4, 165 Name="混無痕", 166 ClassId=4, 167 Age=26 168 }, 169 new Student() 170 { 171 Id=4, 172 Name="37度", 173 ClassId=4, 174 Age=28 175 }, 176 new Student() 177 { 178 Id=4, 179 Name="新的世界", 180 ClassId=4, 181 Age=30 182 }, 183 new Student() 184 { 185 Id=4, 186 Name="Rui", 187 ClassId=4, 188 Age=30 189 }, 190 new Student() 191 { 192 Id=4, 193 Name="帆", 194 ClassId=4, 195 Age=30 196 }, 197 new Student() 198 { 199 Id=4, 200 Name="肩膀", 201 ClassId=4, 202 Age=30 203 }, 204 new Student() 205 { 206 Id=4, 207 Name="孤獨的根號三", 208 ClassId=4, 209 Age=30 210 } 211 }; 212 #endregion 213 return studentList; 214 }
只要實現了IEnumerable這個接口,都是可使用 where,Count等方法,只要底層是實現IEnumerable的,都是linq to object
linq To object 是.netFramwork3.0的一個很是重大的改變
下面展現一下linq to object 的幾種使用方式
1 #region linq to object Show 2 { 3 Console.WriteLine("********************"); 4 var list = from s in studentList 5 where s.Age < 30 6 select s; 7 8 foreach (var item in list) 9 { 10 Console.WriteLine("Name={0} Age={1}", item.Name, item.Age); 11 } 12 } 13 14 { 15 Console.WriteLine("********************"); 16 var list = studentList.Where<Student>(s => s.Age < 30) 17 .Select(s => new 18 { 19 IdName = s.Id + s.Name, 20 ClassName = s.ClassId == 2 ? "高級班" : "其餘班" 21 }); 22 foreach (var item in list) 23 { 24 Console.WriteLine("Name={0} Age={1}", item.ClassName, item.IdName); 25 } 26 } 27 { 28 Console.WriteLine("********************"); 29 var list = from s in studentList 30 where s.Age < 30 31 select new 32 { 33 IdName = s.Id + s.Name, 34 ClassName = s.ClassId == 2 ? "高級班" : "其餘班" 35 }; 36 37 foreach (var item in list) 38 { 39 Console.WriteLine("Name={0} Age={1}", item.ClassName, item.IdName); 40 } 41 } 42 { 43 Console.WriteLine("********************"); 44 var list = studentList.Where<Student>(s => s.Age < 30)//條件過濾 45 .Select(s => new//投影 46 { 47 Id = s.Id, 48 ClassId = s.ClassId, 49 IdName = s.Id + s.Name, 50 ClassName = s.ClassId == 2 ? "高級班" : "其餘班" 51 }) 52 .OrderBy(s => s.Id)//排序 53 54 .OrderByDescending(s => s.ClassId)//倒排 55 .Skip(2)//跳過幾條 56 .Take(3)//獲取幾條 57 ; 58 foreach (var item in list) 59 { 60 Console.WriteLine($"Name={item.ClassName} Age={item.IdName}"); 61 } 62 } 63 {//group by 64 Console.WriteLine("********************"); 65 var list = from s in studentList 66 where s.Age < 30 67 group s by s.ClassId into sg 68 select new 69 { 70 key = sg.Key, 71 maxAge = sg.Max(t => t.Age) 72 }; 73 foreach (var item in list) 74 { 75 Console.WriteLine($"key={item.key} maxAge={item.maxAge}"); 76 } 77 //group by new {s.ClassId,s.Age} 78 //group by new {A=s.ClassId>1} 79 } 80 { 81 Console.WriteLine("********************"); 82 var list = studentList.GroupBy(s => s.ClassId).Select(sg => new 83 { 84 key = sg.Key, 85 maxAge = sg.Max(t => t.Age) 86 }); 87 foreach (var item in list) 88 { 89 Console.WriteLine($"key={item.key} maxAge={item.maxAge}"); 90 } 91 } 92 List<Class> classList = new List<Class>() 93 { 94 new Class() 95 { 96 Id=1, 97 ClassName="初級班" 98 }, 99 new Class() 100 { 101 Id=2, 102 ClassName="高級班" 103 }, 104 new Class() 105 { 106 Id=3, 107 ClassName="微信小程序" 108 }, 109 }; 110 { 111 var list = from s in studentList 112 join c in classList on s.ClassId equals c.Id 113 select new 114 { 115 Name = s.Name, 116 CalssName = c.ClassName 117 }; 118 foreach (var item in list) 119 { 120 Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}"); 121 } 122 } 123 { 124 var list = studentList.Join(classList, s => s.ClassId, c => c.Id, (s, c) => new 125 { 126 Name = s.Name, 127 CalssName = c.ClassName 128 }); 129 foreach (var item in list) 130 { 131 Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}"); 132 } 133 } 134 {//左鏈接 135 var list = from s in studentList 136 join c in classList on s.ClassId equals c.Id 137 into scList 138 from sc in scList.DefaultIfEmpty()// 139 select new 140 { 141 Name = s.Name, 142 CalssName = sc == null ? "無班級" : sc.ClassName//c變sc,爲空則用 143 }; 144 foreach (var item in list) 145 { 146 Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}"); 147 } 148 Console.WriteLine(list.Count()); 149 } 150 { 151 var list = studentList.Join(classList, s => s.ClassId, c => c.Id, (s, c) => new 152 { 153 Name = s.Name, 154 CalssName = c.ClassName 155 }).DefaultIfEmpty();//爲空就沒有了 156 foreach (var item in list) 157 { 158 Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}"); 159 } 160 Console.WriteLine(list.Count()); 161 } 162 { 163 164 } 165 #endregion
linq to sql 運用的是表達式目錄樹,這個底層是實現的IQueryable,概念和linq to object是不同的!