1.匿名类
匿名类编译之后会生成一个具体的泛型类,匿名类的属性是只读的。在临时数据传递时非常方便(linq查询)。匿名类中不能有方法。数据传输(json),数据查询(linq)
1 var Person = new { Name = "jack", Age = 33 };
2.匿名方法
匿名方法编译后会生成一个方法和一个指向该方法的静态的委托对象。匿名方法一定是结合委托使用。一次性使用的方法。匿名方法可以省略参数。
1 delegate void Say(string s); 2 static void Main(string[] args) 3 { 4 //1.将匿名方法指向委托的对象,相当于jquery中的匿名方法 5 Say s = delegate(string ss){ 6 Console.WriteLine(ss); 7 }; 8 //2.第二种写法,在lambda表达式中比较常用,编译后也会生成这样的 9 //Say s = (string ss)=>{ Console.WriteLine(ss);}; 10 s("dd"); 11 Say s1 = delegate{ Console.WriteLine(""); };//省略参数 12 //3. 将匿名方法指向系统委托 13 Func<int, int> f = delegate(int c) 14 { 15 return ++c; 16 }; 17 Console.WriteLine(f(4)); 18 Console.Read(); 19 }
3.扩展方法
扩展方法的本质是调用静态方法。当编译器遇见this时,要转成运行时能够认识的语法(特性:ExtensionAttribute)。优先调用实例方法。当你使用其他程序集中的扩展方法时要先将扩展方法所在的程序集导入,并在当前类中引用命名空间。扩展方法可以被继承。
public static class MethodExten { public static string CutStr(this string s, int length) { return null; } } string tag="www"; tag.CutStr(3); MethodExten.CutStr(tag, 3);//本质
4.系统内置委托:
(1)Action
public delegate void Action
(2)Predicate
(3)Comparison
(4)Func
例题:
1 static class Program 2 { 3 delegate void Say(string s); 4 static void Main(string[] args) 5 { 6 List<int> list = new List<int>() { 4, 7, 2, 7 }; 7 8 //1.系统委托1 Action9 Action<int> a = delegate(int i) { Console.WriteLine(++i); }; 10 //利用系统委托aciton遍历集合 11 //list.ForEach(new Action (delegate(int i) { Console.WriteLine(i); })); //同下 12 list.ForEach(delegate(int i) { Console.WriteLine(i); }); 13 a(4); 14 15 //2.系统委托2 Predicate返回bool 16 list = list.FindAll(delegate(int i) { return i > 4; }); 17 18 //3.系统委托3 Comparison返回int 传入两个参数 19 list.Sort(new Comparison<int>(delegate(int x, int y) { return x - y; })); 20 21 //4.系统委托4 Func 自定义参数的委托,最后一个参数为返回值类型 22 ListdogList = new List () { new Dog() { Name = "jack", Age = 33 } }; 23 var smallDogList= dogList.GetSelect ( 24 delegate(Dog d) { return new SmallDag() { Name = d.Name }; 25 }); 26 //*****系统select扩展方法---简化过程 27 28 dogList.Select(new Func (delegate(Dog c) { return new SmallDag { Name = c.Name }; })); 29 //将已知的对象转换成匿名类----将大量使用--因为无法确认返回类型,所以必须用var 30 var dlist= dogList.Select(delegate(Dog c) { return new { Name = c.Name }; }); 31 dogList.Select((Dog c) => { return new { Name = c.Name }; });//简写版(lambda) 32 dogList.Select((c) =>{ return new { Name = c.Name }; });//省略参数类型 33 dogList.Select(c => { return new { Name = c.Name }; });//一个参数省略小括号,多个参数不能省略 34 dogList.Select(c =>new { Name = c.Name });//方法体只有一句时,省略return和花括号,如果有多条语句则必须加return 和花括号。 35 Console.Read(); 36 } 37 //select扩展方法本质说明 38 static List GetSelect (this List l, Func func) 39 { 40 List list = new List(); 41 foreach (T item in l) 42 { 43 list.Add(func(item)); 44 } 45 return list; 46 } 47 } 48 49 class Dog 50 { 51 public string Name { get; set; } 52 public int Age { get; set; } 53 } 54 class SmallDag 55 { 56 public string Name { get; set; } 57 }
5.Lambda表达式
Lambda表达式:Lambda不使用delegate关键字,而使用 Lambda运算符 =>。Lambda的本质是匿名方法,匿名方法的本质是委托,委托的本质是类。
标准查询运算符(SQO):定义在System.Linq.Enumerable类中的50多个为IEnumerable
例题:
1 //join 等值连接 ????左外连接呢,怎么写(linq解决) 2 var lists= listDog.Join(listToy, d => d.Id, t => t.DogId, (d, t) => new {DogId=d.Id,DogName=d.Name,DToyName=t.ToyName }).ToList(); 3 lists.ForEach(c=>Console.WriteLine(c)); 4 //linq的等值连接 5 var r = (from d in listDog 6 join t in listToy 7 on d.Id equals t.DogId 8 select new { 9 DogId = d.Id, DogName = d.Name, DToyName = t.ToyName 10 }).ToList(); 11 //linq的左外连接 12 var r = (from d in listDog 13 join t in listToy 14 on d.Id equals t.DogId 15 into temp 16 from ts in temp.DefaultIfEmpty() 17 select new { DogId = d.Id, DogName = d.Name, DToyName = (ts==null?"不存在":ts.ToyName) }).ToList(); 18 r.ForEach(c => Console.WriteLine(c)); 19 20 //group 分组查询 21 IEnumerableint,Dog>> groups= listDog.GroupBy(d=>d.Age);//获得多个组 22 foreach (var group in groups) 23 { 24 Console.WriteLine("按年龄分组:"+group.Key+"----此组共有:"+group.Count()); 25 foreach (var item in group)//循环每组(有多个Dog) 26 { 27 Console.WriteLine(item.Name); 28 } 29 Console.WriteLine("--------------"); 30 } 31 32 //skip take 分页 每页两行 33 int pageSize = 2; 34 int pageIndex=8; 35 var pageList= listDog.OrderByDescending(d=>d.Id).Skip((pageIndex-1)*pageSize).Take(pageSize); 36 37 static List GetDogList() 38 { 39 List dog = new List { 40 new Dog(){ Id=1,Name="jack",Age=22}, 41 new Dog(){ Id=2,Name="tom",Age=12}, 42 new Dog(){ Id=3,Name="loly",Age=32}, 43 new Dog(){ Id=4,Name="kimi",Age=22}, 44 new Dog(){ Id=5,Name="lily",Age=42}, 45 new Dog(){ Id=6,Name="saly",Age=39}, 46 }; 47 return dog; 48 } 49 static List GetDogToyList() 50 { 51 List dog = new List { 52 new DogToy(){ DogId=1, ToyName="dd"}, 53 new DogToy(){ DogId=2, ToyName="沙发"}, 54 new DogToy(){ DogId=7, ToyName="沙发"} 55 56 }; 57 return dog; 58 }
6. LINQ
Linq:编译后的IL又生成了标准查询运算符(lambda)。标准运算符中除了分页的方法都能转换成linq。
例题:
1 //连接 多表查询---下面为等值连接即内连接 2 var data = from p in ps 3 join a in ana on p.PID equals a.PID 4 select new {PID=p.PID,PName=p.Name,PAge=p.Age,PPhone=p.Phone,AID=a.AID,AName=a.Name }; 5 foreach (var item in data) 6 { 7 Console.WriteLine(item.PID+"--"+item.PName+"--"+item.PAge+"--"+item.PPhone+"--"+item.AID+"--"+item.AName); 8 } 9 Console.WriteLine("----------------左连接------------------------"); 10 //左连接的写法 11 var data1 = from p in ps 12 join a in ana on p.PID equals a.PID 13 into temp //临时表 14 from t in temp.DefaultIfEmpty() 15 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")}; 16 foreach (var item in data1) 17 { 18 Console.WriteLine(item.PID + "--" + item.PName + "--" + item.PAge + "--" + item.PPhone + "--" + item.AID+ "--" + item.AName); 19 }