lambda,linq

一:什麼是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 }
View Code

使用反編譯工具看會產生一個私有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 }
View Code

而後調用的時候以下:

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         }
View Code

只要實現了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
View Code

 linq to sql 運用的是表達式目錄樹,這個底層是實現的IQueryable,概念和linq to object是不同的!

相關文章
相關標籤/搜索