2,隐式类型 var
3,参数默认值 和 命名参数
4,对象初始化器 与 集合初始化器 { }
5,匿名类 & 匿名方法(重点)
6,扩展方法 (重点)
7,系统内置泛型委托 Func / Action(重点)
8,Lambda表达式 (=> goes to) (重点)
9,标准查询运算符 Standard query operator(重点)
10,LINQ查询表达式(重点) 1.0自动属性: public string Age{get;set;}--这样写的属性叫自动属性 自动属性在本质上还是这样的代码,是中间语言帮我们翻译过来的。 public string age public string Age { get { return Age; } set { age=Value; } } ----------------------------------------------------------------------------------------------------------- 2.0,隐式类型 var的特点: 2.1,:var 用处:在无法确定类型的时候用var来接收 /// 特点: /// 1、var类型会被编译器根据初始值的类型推断出具体的类型 /// 2、var类型的局部变量必须赋予初始值 /// 3、无法将null赋值给隐式类型的局部变量(因为null值是一个空值,编译器无法) /// 4、var类型变量的定义必须是方法中或者属性中get和set的局部变量才能使用不能在类中定义 /// 5、var不能用作方法的参数 /// 6、初始化不是一个匿名函数(匿名方法,匿名委托) /// 7、语句中只声明一次变量,声明后不能更改类型 代码: static void C02Var() { var pig = new Pig(); //编译完成以后代码会变成 Pig pig = new Pig(); var p = pig; // pig = 100; //var类型的字段不能是一个匿名委托 // var d = delegate(int i) { return i; }; // var s = null; //Console.WriteLine(pig.ToString()); } public string Name { get { var p = new Pig(); return p.Name; } } ----------------------------------------------------------------------------------------------------------- 3.0匿名类 (重要) /// 1、匿名类的写法 new {key=value的形式定义你想要的属性} /// 2、匿名类本质上被编译器生成了一个泛型类,在此类的构造函数中给相应的字段赋值 /// 3、当两个匿名类的参数名称一样,个数也一样,但是类型不一样共用一个泛型类 /// 4、当两个匿名类的个数不一样或者参数名称不一样必须重新生成各自的泛型类 /// 5、注意点,匿名类中的属性一定要赋初始值,否则报错 代码: static void C03AnmClass() { Pig pig = new Pig(); //匿名类的写法 var d = new { Name = "小花狗", Age = 1, ToyName = "飞碟" }; var d1 = new { Name = 1, Age = "10", ToyName = "飞碟" }; var d2 = new { Name = 1, Age = "10" }; var d3 = new { Age = "10", Name = 1 }; var d4 = new { Age = "10", Name11 = 1 }; Console.WriteLine(d.Name + ",Age=" + d.Age + " " + d.ToyName); } ----------------------------------------------------------------------------------------------------------- 4.0参数默认值 和 命名参数 3.1默认参数 代码: /// <summary> /// 给参数默认值 /// </summary> /// <param name="name"></param> /// <param name="age"></param> static void C0401(string name = "八戒", int age = 500) { Pig pig = new Pig(); pig.Name = name; pig.Age = age; } 3.2命名参数 代码: static void C04DefaultValue() { C0401(); //编译器会自动根据C0401方法中的参数默认值补全此处的写法: C0401("八戒", 500); C0401( "孙悟空" ); //命名参数 C0401(age: 1000); // C0401("八戒", 500); } ----------------------------------------------------------------------------------------------------------- 5.0对象/集合 初始化器 static void C0501ObjectInit() { Pig p = new Pig() { Name = "八戒", Age = 500 }; } static void C0502ListInit() { var plist = new List< Pig>(); plist.Add( new Pig () { Name = "1", Age = 1 }); plist.Add( new Pig () { Name = "2", Age = 2 }); var plist1 = new List< Pig> { new Pig () { Name = "1", Age = 1 }, new Pig () { Name = "2", Age = 2 } }; } /// <summary> /// 数组初始化器 /// </summary> static void C0503ArryInit() { Pig[] arr = new Pig[2]; arr[0] = new Pig () { Name = "1", Age = 1 }; Pig[] arr1 = new Pig[] { new Pig () { Name = "1", Age = 1 } }; //System.Data.SqlClient.SqlParameter[] ps = new System.Data.SqlClient.SqlParameter[] { //new System.Data.SqlClient.SqlParameter(); //}; } ----------------------------------------------------------------------------------------------------------- 5.0匿名类 5.1匿名类的写法new {key=value的形式定义你想要的属性} 5.2匿名类本质上被编译生成一个泛型类,在此类的构造函数中给相应的字段赋值 5.3当两个匿名类的参数名称一样,个数也一样,但是类型不一样共用一个泛型类 5.4当两个匿名类的个数不一样或者参数名称不一样必须重新生成各自的泛型类 5.5注意点,匿名类中的属性一定要赋初始值,否则报错 ----------------------------------------------------------------------------------------------------------- 6.0匿名方法(匿名函数,匿名委托)--这个三个是一个东西 //1.0匿名方法的写法规则: //定义了一个整数入参,返回类型为bool的委托 public delegate bool DProcess( int p); //定义一个和委托具有同签名的方法 static bool Prcss(int p) { return p > 2; } static void C06AnmMethod() { //1.0 匿名方法的写法规则: //delegate(编写匿名方法的参数,格式和类型由程序员自己根据业务逻辑来定义){函数的方法体代码} //2.0 利用和委托Predicate<T>具有同前面的方法进行查询 List<int > ilist = new List< int>() { 1, 2, 3, 4, 5, 6, 7 }; //需求从ilist集合中获取大于2的所有元素以新集合返回 var nlist = ilist.FindAll(Prcss); foreach (var item in nlist) { Console.WriteLine(item.ToString()); } Console.WriteLine("---------分割-=--" ); //3.0利用匿名委托实现第2步的业务 var nlistg1 = ilist.FindAll(delegate (int p) { return p > 5; }); foreach (var item in nlistg1) { Console.WriteLine(item.ToString()); } } 匿名方法没有听懂,下去在看视频 07 - lambda表达式的推断和注意写法 总结: 1,如果参数只有一个,则可以省略小括号,只是留下形参名称 如果参数个大于1个,必须要保留小括号。 2,当方法只有一句代码的时候,可以省略{}和最后面的分号 ,如果有返回值的可以省略return 3,当方法有多条句代码的时候不能省略{},如果有返回值的也不 可以省略return ----------------------------------------------------------------------------------------------------------- 7.0扩展方法 7.1要素:此方法必须是一个静态方法 2,此方法必须放在静态类中 3此方法的第一个参数必须以this 开头,并且指定此方法是扩展自哪个类型上的 。 4、扩展方法扩展自哪个类型,就必须是此类型的变量来点,其他类型无法使用 5、扩展方法中的this后面的参数不属于 方法的参数 6、如果扩展方法和实例方法具有相同的签名,则优先调用实例方法 7、扩展自父类上的方法,可以被子类的对象直接使用 8、扩展自接口上的扩展方法,可以被实现类的对象直接使用 9、扩展方法的本质,最终还是被编译器编译成了 静态类.静态方法() 代码: static void C07ExtMethod() { DateTime now = DateTime .Now; string fmtStr = now.ToString("yyyy-MM-dd HH:MM:ss" ); string fmtStr1 = now.ToString("yyyy-MM-dd" ); string fmtStr2 = ExtHelper .FmtDate(now); //扩展方法 string fmtStr3 = now.FmtDate(); //此种写法是 语法糖 最终被编译成了 ExtHelper.FmtDate(now) string str = "hi" ; string res = str.ToUpper(); // smallPig pig = new smallPig() { Name = "八戒" }; pig.GetName(); Console.WriteLine(res); } ///----------------------------------------------------------------------------------------------------------- 系统内置委托
Action委托 接受参数 无返回值 -->匿名函数的写法 delegate(int i){console.write(1);}
Predicate 泛型委托 接收参数 返回bool
Func 接收参数,返回参数 但是不固定
System.comparison<T> 返回一个整数,接受两个相同类型的参数
#region 8.0.1 Action委托 接收参数 无返回值 static void C0801Action() { List<int > list = new List< int>() { 1,2,3,4,5 }; //遍历打印元素 //list.ForEach(fe); //利用匿名函数打印 //list.ForEach(delegate(int i) { Console.WriteLine(i); }); //利用lambda表达式打印 list.ForEach(i => Console.WriteLine(i)); } static void fe(int i) { Console.WriteLine(i); } #endregion #region 8.0.2 Predicate 泛型委托:接收一个参数,返回bool类型 static void C0802Predicate() { var list = GetPigList(); var nlist = list.FindAll(c => c.Age > 100); //获取当前list集合中,名字为小猪的对象,如果有多个只返回第一个 var pig = list.Find(c => c.Name == "小猪"); } #endregion #region 8.0.3 Func :接收参数,返回参数,但是不固定 static void C0803Func() { var list = GetPigList(); //需求:查找list中年龄大于1岁的所有猪的集合 var nlist = list.Where(c => c.Age > 1); var nlist1 = nlist.ToList(); nlist1.ForEach(c => Console.WriteLine(c.ToString())); } #endregion #region 8.0.4 System.Comparison<T> 返回一个整数,接收两个同类型的参数 static void C0804Comparison() { var list = GetPigList(); //将list中的所有猪对象按照年龄倒序排列 list.Sort(Query1); list.Sort( delegate(Pig p, Pig n) { return n.Age - p.Age; }); list.Sort((p, n) => n.Age - p.Age); list.ForEach(c => Console.WriteLine(c.ToString())); } static int Query1(Pig p, Pig n) { return n.Age - p.Age; } #endregion #region 作业 static void Case8() { var list = GetPigList(); //需求1:利用where方法 从list集合中获取 年龄大于2 并且包含有八的集合 //findall() where() Find() FirstOrDefaut() var list2 = list.Where(a=>a.Age>2 && a.Name.Contains("八")); var nlist = list2.ToList(); nlist.ForEach(l => Console.WriteLine(l.Name + l.Age)); } #endregion -----------------------------------------------------------------------------------------------------------s SQO方法 —标准查询运算符Where() ,firstordefult(),lastordefult() 方法进行查询操作
对集合进行排序
正序排序:Orderby(); fun<T,Tkey> 表示Tkey 从T中选择一个属性后推算出类型
倒序排序:orderbydescending()
根据多个字段组合排序: list.orderbydescending().
总结:对于一个集合进行单个字段的升序排序使用 orderBy() 降序:orderbydesccending()
投影方法: 集合.select(); 从一个集合拿到需要的属性,生成新的集合
分页方法:skip(起始).take(页容量) skip():表示跳过前面几行