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
作者:梦亦晓,转载请注明出处
如果此文能给您提供帮助,请点击右下角的【推荐】
如果您对此文有不同的见解或者意见,欢迎留言讨论