1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading;
6 using System.Threading.Tasks;
7
8 namespace MyLinq
9 {
10 /// <summary>
11 /// Linq To Object
12 /// .NetFramework3.0的一个非常重大的改变
13 /// </summary>
14 public class LinqShow
15 {
16 #region Data Init
17 private List<Student> GetStudentList()
18 {
19 #region 初始化数据
20 List<Student> studentList = new List<Student>()
21 {
22 new Student()
23 {
24 Id=1,
25 Name="赵亮",
26 ClassId=2,
27 Age=35
28 },
29 new Student()
30 {
31 Id=1,
32 Name="再努力一点",
33 ClassId=2,
34 Age=23
35 },
36 new Student()
37 {
38 Id=1,
39 Name="王炸",
40 ClassId=2,
41 Age=27
42 },
43 new Student()
44 {
45 Id=1,
46 Name="疯子科学家",
47 ClassId=2,
48 Age=26
49 },
50 new Student()
51 {
52 Id=1,
53 Name="灭",
54 ClassId=2,
55 Age=25
56 },
57 new Student()
58 {
59 Id=1,
60 Name="黑骑士",
61 ClassId=2,
62 Age=24
63 },
64 new Student()
65 {
66 Id=1,
67 Name="故乡的风",
68 ClassId=2,
69 Age=21
70 },
71 new Student()
72 {
73 Id=1,
74 Name="晴天",
75 ClassId=2,
76 Age=22
77 },
78 new Student()
79 {
80 Id=1,
81 Name="旭光",
82 ClassId=2,
83 Age=34
84 },
85 new Student()
86 {
87 Id=1,
88 Name="oldkwok",
89 ClassId=2,
90 Age=30
91 },
92 new Student()
93 {
94 Id=1,
95 Name="乐儿",
96 ClassId=2,
97 Age=30
98 },
99 new Student()
100 {
101 Id=1,
102 Name="暴风轻语",
103 ClassId=2,
104 Age=30
105 },
106 new Student()
107 {
108 Id=1,
109 Name="一个人的孤单",
110 ClassId=2,
111 Age=28
112 },
113 new Student()
114 {
115 Id=1,
116 Name="小张",
117 ClassId=2,
118 Age=30
119 },
120 new Student()
121 {
122 Id=3,
123 Name="阿亮",
124 ClassId=3,
125 Age=30
126 },
127 new Student()
128 {
129 Id=4,
130 Name="37度",
131 ClassId=4,
132 Age=30
133 }
134 ,
135 new Student()
136 {
137 Id=4,
138 Name="关耳",
139 ClassId=4,
140 Age=30
141 }
142 ,
143 new Student()
144 {
145 Id=4,
146 Name="耳机侠",
147 ClassId=4,
148 Age=30
149 },
150 new Student()
151 {
152 Id=4,
153 Name="Wheat",
154 ClassId=4,
155 Age=30
156 },
157 new Student()
158 {
159 Id=4,
160 Name="Heaven",
161 ClassId=4,
162 Age=22
163 },
164 new Student()
165 {
166 Id=4,
167 Name="等待你的微笑",
168 ClassId=4,
169 Age=23
170 },
171 new Student()
172 {
173 Id=4,
174 Name="畅",
175 ClassId=4,
176 Age=25
177 },
178 new Student()
179 {
180 Id=4,
181 Name="混无痕",
182 ClassId=4,
183 Age=26
184 },
185 new Student()
186 {
187 Id=4,
188 Name="37度",
189 ClassId=4,
190 Age=28
191 },
192 new Student()
193 {
194 Id=4,
195 Name="新的世界",
196 ClassId=4,
197 Age=30
198 },
199 new Student()
200 {
201 Id=4,
202 Name="Rui",
203 ClassId=4,
204 Age=30
205 },
206 new Student()
207 {
208 Id=4,
209 Name="帆",
210 ClassId=4,
211 Age=30
212 },
213 new Student()
214 {
215 Id=4,
216 Name="肩膀",
217 ClassId=4,
218 Age=30
219 },
220 new Student()
221 {
222 Id=4,
223 Name="孤独的根号三",
224 ClassId=4,
225 Age=30
226 }
227 };
228 #endregion
229 return studentList;
230 }
231 #endregion
232
233 public void Show()
234 {
235 List<Student> studentList = this.GetStudentList();
236 //常规情况下数据过滤
237 //{
238 // //年纪小于30
239 // var list = new List<Student>();
240 // foreach (var item in studentList)
241 // {
242 // if (item.Age < 30)
243 // {
244 // list.Add(item);
245 // }
246 // }
247 // {
248 // Console.WriteLine("*****************************************");
249 // var result = studentList.ElevenWhere<Student>(s => s.Age < 30);
250 // foreach (var item in result)
251 // {
252 // Console.WriteLine(item.Name);
253 // }
254 // }
255 // {
256 // Console.WriteLine("*****************************************");
257 // var result = studentList.ElevenWhereIterator<Student>(s => s.Age < 30);
258 // foreach (var item in result)
259 // {
260 // Console.WriteLine(item.Name);
261 // }
262 // }
263
264 //}
265
266 //{
267 // //Name长度大于2的
268 // var list = new List<Student>();
269 // foreach (var item in studentList)
270 // {
271 // if (item.Name.Length > 2)
272 // {
273 // list.Add(item);
274 // }
275 // }
276
277 // //var result = ExtendMethod.ElevenWhere(studentList, s => s.Name.Length > 2);
278 // var result = studentList.ElevenWhere(s => s.Name.Length > 2);
279 //}
280
281 //{
282 // //N个条件叠加
283 // var list = new List<Student>();
284 // foreach (var item in studentList)
285 // {
286 // if (item.Id > 1
287 // && item.Name != null
288 // && item.ClassId == 1
289 // && item.Age > 20)
290 // {
291 // list.Add(item);
292 // }
293 // }
294 // var result = studentList.ElevenWhere(item => item.Id > 1
295 // && item.Name != null
296 // && item.ClassId == 1
297 // && item.Age > 20);
298 //}
299
300 //{
301 // new List<int>() { 12423434, 45, 53, 45, 43, 534, 534, 543, 5, 435, 45, 45, }
302 // .ElevenWhere(i => i > 10);
303 //}
304
305 #region Linq 扩展方法&表达式
306 {
307 var list = studentList.Where<Student>(s => s.Age < 30);//陈述句 言出法随 封装的好
308 foreach (var item in list)
309 {
310 Console.WriteLine("Name={0} Age={1}", item.Name, item.Age);
311 }
312 }
313 {
314 Console.WriteLine("********************");
315 var list = from s in studentList
316 where s.Age < 30
317 select s;
318
319 foreach (var item in list)
320 {
321 Console.WriteLine("Name={0} Age={1}", item.Name, item.Age);
322 }
323 }
324 #endregion
325
326 #region linq to object Show
327 {
328 //这里有一堆学生 每个学生都转换成别的对象
329
330 Console.WriteLine("**********投影**********");
331 var list = studentList.Where<Student>(s => s.Age < 30)
332 .Select(s => new
333 {
334 IdName = s.Id + s.Name,
335 ClassName = s.ClassId == 2 ? "高级班" : "其他班"
336 });
337 foreach (var item in list)
338 {
339 Console.WriteLine("Name={0} Age={1}", item.ClassName, item.IdName);
340 }
341 }
342 {
343 Console.WriteLine("********************");
344 var list = from s in studentList
345 where s.Age < 30
346 select new
347 {
348 IdName = s.Id + s.Name,
349 ClassName = s.ClassId == 2 ? "高级班" : "其他班"
350 };
351
352 foreach (var item in list)
353 {
354 Console.WriteLine("Name={0} Age={1}", item.ClassName, item.IdName);
355 }
356 }
357 {
358 //IN查询
359 var list = studentList.Where<Student>(s => s.Age < 30)
360 .Where(s => new int[] { 1, 2, 3, 4 }.Contains(s.ClassId))
361 .Select(s => new
362 {
363 IdName = s.Id + s.Name,
364 ClassName = s.ClassId == 2 ? "高级班" : "其他班"
365 });
366 }
367
368 {
369 Console.WriteLine("********************");
370 var list = studentList.Where<Student>(s => s.Age < 30)//条件过滤
371 .Select(s => new//投影
372 {
373 Id = s.Id,
374 ClassId = s.ClassId,
375 IdName = s.Id + s.Name,
376 ClassName = s.ClassId == 2 ? "高级班" : "其他班"
377 })
378 .OrderBy(s => s.Id)//排序
379 //.ThenBy//2个都生效
380 .OrderByDescending(s => s.ClassId)//倒排 最后一个生效
381 .Skip(2)//跳过几条
382 .Take(3)//获取几条
383 ;
384 foreach (var item in list)
385 {
386 Console.WriteLine($"Name={item.ClassName} Age={item.IdName}");
387 }
388 }
389 {
390 var list = from s in studentList
391 where s.Age < 30
392 group s by s.ClassId into sg
393 select sg;
394 foreach (var data in list)
395 {
396 Console.WriteLine(data.Key);
397 foreach (var item in data)
398 {
399 Console.WriteLine($"{item.Id} {item.Name} {item.Age}");
400 }
401 }
402 }
403 {//group by
404 Console.WriteLine("********************");
405 var list = from s in studentList
406 where s.Age < 30
407 group s by s.ClassId into sg
408 select new
409 {
410 key = sg.Key,
411 maxAge = sg.Max(t => t.Age)
412 };
413 foreach (var item in list)
414 {
415 Console.WriteLine($"key={item.key} maxAge={item.maxAge}");
416 }
417 //group by new {s.ClassId,s.Age}
418 //group by new {A=s.ClassId>1}
419 }
420 {
421 //var list = studentList.GroupBy(s => new { s.ClassId, s.Age }).Select(sg => new
422 //{
423 // key = sg.Key,
424 // maxAge = sg.Max(t => t.Age)
425 //});
426 //foreach (var item in list)
427 //{
428 // item.ke
429 //}
430 }
431 {
432 Console.WriteLine("********************");
433 var list = studentList.GroupBy(s => s.ClassId).Select(sg => new
434 {
435 key = sg.Key,
436 maxAge = sg.Max(t => t.Age)
437 });
438 foreach (var item in list)
439 {
440 Console.WriteLine($"key={item.key} maxAge={item.maxAge}");
441 }
442 }
443 List<Class> classList = new List<Class>()
444 {
445 new Class()
446 {
447 Id=1,
448 ClassName="初级班"
449 },
450 new Class()
451 {
452 Id=2,
453 ClassName="高级班"
454 },
455 new Class()
456 {
457 Id=3,
458 ClassName="微信小程序"
459 },
460 };
461 {
462 var list = from s in studentList
463 join c in classList on s.ClassId equals c.Id//不能用==只能equals
464 select new
465 {
466 Name = s.Name,
467 CalssName = c.ClassName
468 };
469 foreach (var item in list)
470 {
471 Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}");
472 }
473 }
474 {
475 var list = studentList.Join(classList, s => s.ClassId, c => c.Id, (s, c) => new
476 {
477 Name = s.Name,
478 CalssName = c.ClassName
479 });
480 foreach (var item in list)
481 {
482 Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}");
483 }
484 }
485 {//左连接
486 var list = from s in studentList
487 join c in classList on s.ClassId equals c.Id
488 into scList
489 from sc in scList.DefaultIfEmpty()//
490 select new
491 {
492 Name = s.Name,
493 CalssName = sc == null ? "无班级" : sc.ClassName//c变sc,为空则用
494 };
495 foreach (var item in list)
496 {
497 Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}");
498 }
499 Console.WriteLine(list.Count());
500 }
501 {
502 var list = studentList.Join(classList, s => s.ClassId, c => c.Id, (s, c) => new
503 {
504 Name = s.Name,
505 CalssName = c.ClassName
506 }).DefaultIfEmpty();//为空就没有了
507 foreach (var item in list)
508 {
509 Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}");
510 }
511 Console.WriteLine(list.Count());
512 }
513 {
514 //Min Max Sum
515 }
516 #endregion
517
518 {
519 //linq to sql
520 IQueryable<Student> list = studentList.AsQueryable();
521 list.Where<Student>(s => s.Age > 30);//操作数据库
522 //list.Where<Student>(s =>
523 //{
524 // Console.WriteLine("12354");
525 // return s.Age > 30;
526 //});
527 }
528 {
529 studentList.Where<Student>(s =>
530 {
531 Console.WriteLine("12354");
532 return s.Age > 30;
533 }
534 );
535 }
536 }
537
538 }
539 }