LINQ的高级应用

---恢复内容开始---

本文不想罗列linq的通俗使用方法。因为很多博文都已经写得很详细了。

此处直接贴出源码,如果有需要的朋友可以参考,希望更多的朋友能够补充更多的linq的高级应用。

源码如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading;
  6 
  7 namespace linq
  8 {
  9 class Program
 10 {
 11 static void Main(string[] args)
 12 {
 13 Person[] ps = { 
 14 new Person{Name="jack",Age=33,Phone="23564",PID=1},
 15 new Person{Name="tom",Age=35,Phone="235asdg64",PID=2},
 16 new Person{Name="jerry",Age=22,Phone="235dasg64",PID=3},
 17 new Person{Name="lily",Age=33,Phone="23asdg564",PID=4}
 18 };
 19 Animal[] ana = { 
 20 new Animal{AID=1,Name="dog",PID=1},
 21 new Animal{AID=1,Name="cat",PID=1},
 22 new Animal{AID=1,Name="dog",PID=2},
 23 new Animal{AID=1,Name="chicken",PID=1},
 24 new Animal{AID=1,Name="dog",PID=3},
 25 new Animal{AID=1,Name="dog",PID=1},
 26 new Animal{AID=1,Name="cat",PID=3},
 27 new Animal{AID=1,Name="cat",PID=2}
 28 };
 29 Console.WriteLine("----------------分组排序------------------------");
 30 //分组
 31 var result = from p in ps
 32 group p by p.Age into g//根据p的值对p进行分组,每组放入g变量中
 33 orderby g.Count() descending
 34 //g.Key为每一组的“组标识”(比如根据年龄groupby,年龄就是组标识)
 35 select new { Name = g.Key, Count = g.Count() };
 36 ps.Where(p => p.Age > 0);
 37 foreach (var p in result)
 38 {
 39 Console.WriteLine("年龄为:"+p.Name + "的人数是:" + p.Count);
 40 }
 41 
 42 Console.WriteLine("----------------等值连接------------------------");
 43 //连接 多表查询---下面为等值连接即内连接
 44 var data = from p in ps
 45 join a in ana on p.PID equals a.PID
 46 select new {PID=p.PID,PName=p.Name,PAge=p.Age,PPhone=p.Phone,AID=a.AID,AName=a.Name };
 47 foreach (var item in data)
 48 {
 49 Console.WriteLine(item.PID+"--"+item.PName+"--"+item.PAge+"--"+item.PPhone+"--"+item.AID+"--"+item.AName);
 50 }
 51 Console.WriteLine("----------------左连接------------------------");
 52 //左连接的写法
 53 var data1 = from p in ps
 54 join a in ana on p.PID equals a.PID
 55 into temp //临时表
 56 from t in temp.DefaultIfEmpty()
 57 select new { PID = p.PID, PName = p.Name, PAge = p.Age, PPhone = p.Phone, AID =( t!=null?t.AID:0), AName = (t!=null?t.Name:"null")};
 58 foreach (var item in data1)
 59 {
 60 Console.WriteLine(item.PID + "--" + item.PName + "--" + item.PAge + "--" + item.PPhone + "--" + item.AID+ "--" + item.AName);
 61 }
 62 
 63 //lamba本质剖析
 64 var d1 = from p in ps
 65 where p.Age>30
 66 select p;
 67 //Where,Select等均为IEnumerable接口的扩展方法
 68 var d2 = ps.Where(p => p.Age > 30).Select(p => p);
 69 var d3 = ps.Where(p => p.Age > 30);
 70 var d4 = ps.Where((p) => p.Age > 30);
 71 //其实where方法内的参数是一个匿名方法或者说是匿名委托 var p=function(parameter){return i>0}
 72 //系统委托 public delegate TResult Func<in T, out TResult>(T arg);
 73 //当只有一个参数,方法内只有一行代码时可以简写为 var d3 = ps.Where(p => p.Age > 30);
 74 var d5 = ps.Where((p) => { return p.Age > 30; });
 75 
 76 //lamba在多线程中的应用
 77 //i => { Console.WriteLine("hhh" +i); }就是一个匿名方法或者说匿名委托
 78 //Thread t1 = new Thread(i => { Console.WriteLine("hhh" +i); });
 79 Thread t1 = new Thread((i) => { Console.WriteLine("我是多线程委托实现:" + i); });
 80 t1.Start(3);
 81 
 82 //匿名委托的实现方式
 83 //DelFun dfun=delegate(int i){Console.WriteLine(i);};
 84 DelFun dfun = (i => { Console.WriteLine("我是匿名委托:"+i); });
 85 dfun(555);
 86 
 87 Console.Read();
 88 }
 89 delegate void DelFun(int i);
 90 class Person
 91 {
 92 public int PID { get; set; }
 93 public string Name { get; set; }
 94 public int Age { get; set; }
 95 public string Phone { get; set; }
 96 }
 97 class Animal
 98 {
 99 public int AID { get; set; }
100 public string Name { get; set; }
101 public int PID { get; set; }
102 
103 }
104 }
105 }
106 
107  
作者:梦亦晓,转载请注明出处
如果此文能给您提供帮助,请点击右下角的【推荐
如果您对此文有不同的见解或者意见,欢迎留言讨论
原文地址:https://www.cnblogs.com/eggTwo/p/3292065.html