1、-1-掌握推断类型的使用 掌握扩展方法的定义和调用 掌握对象初始化器的使用 掌握匿名类的使用 了解Lambda表达式 掌握使用LINQ查询 新关键词dynamic 可选(或)默认参数 命名参数目标-2-推断类型 C#4.0新增了推断数据类型,可以使用var关键字来声明变量,编译器在编译时会根据初始化数据推断变量的数据类型:int num1=3/使用显式类型声明var num2=3/使用推断类型声明static public void Main()/使用推断类型定义一个整型变量totalvar total=0;/使用推断类型定义一个整型数组avar a=new int 4,18,11,9,8,1
2、0,5;/遍历数组并求和foreach(var e in a)total+=e;Console.WriteLine(e);Console.WriteLine(和:+total);-3-扩展方法-1 扩展方法可以从某个数据类型外部向该类型添加方法。扩展方法可以像普通实例方法那样进行调用。扩展方法的格式:扩展方法的需要注意以下几点:p 扩展方法只能声明在静态类中p 扩展可以继承,对于System.Object的扩展将被所有类继承。p 扩展方法定义中的第一个参数必须以this关键字进行修饰。p 扩展方法只能对方法进行扩展,不支持属性、事件等。例如:访问符 static 返回类型 扩展方法名(this
3、 参数)方法体public static void Print(this string str)Console.WriteLine(String的扩展方法:+str);-4-扩展方法-2 扩展方法还可以带多个参数,例如:调用了此扩展方法:注意:调用扩展方法时,不要为第一个参数赋值,因为第一个参数被绑定到调用该方法的数据类型的实例。public static void PrintAndPunctuate(this string str,string punc)Console.WriteLine(str+punc);example.PrintAndPunctuate(.)-5-对象初始化器-1 对
4、象初始化器提供了一种简单的、对类的对象进行初始化的方式,它可以在单个语句中调用类的构造函数并设置属性的值。示例:Customer cust=new CustomerName=Toni Poe,City=Louisville;Customer cust=new Customer()Name=zhangsan,Addr=new AddressCity=Qingdao,Street=xianggangzhonglu,Age=20;-6-对象初始化器-2对象初始化器还可以嵌套,例如:Customer cust=new Customer()Name=zhangsan,Addr=new Address C
5、ity=Qingdao,Street=xianggangzhonglu ,Age=20 ;-7-匿名类 匿名类可以不对类进行定义而直接创建实例,编译器会根据声明时指定的属性来创建类的定义。匿名类没有名称,它继承Object,包含在声明时所指定的属性。示例:var anonyProduct=New Name=paperclips,Price=1.29;-8-Lambda表达式 Lambda表达式是一种匿名函数,用于计算并返回单个值。示例:调用:x=x+1 /以表达式作为Lambda表达式x=return x+1 /以语句块作为Lambda表达式(x,y)=x*y /多个参数int numbers
6、=new int 12,4,31,22,27,14,6,29;int num2=numbers.Where(n=n20).ToArray();-9-LINQ简介 LINQ(Language Integrated Query)是语言集成查询的简称,是Visual Studio 2010和.NET Framework 4.0中一项突破性的创新。LINQ是一个编程模型,提供统一的方法访问文件、XML、数据库等数据。LINQ有4部分组成:LINQ to Objects、LINQ to SQL、LINQ to DataSet和LINQ to XML。-10-LINQ查询步骤 所有LINQ查询操作都有如下
7、3个步骤:p 获取数据源:指定数据源是数据库、XML还是普通的集合。p 创建查询:根据用户要求和LINQ的查询语法,设置查询语句。p 执行查询:从指定的数据源中找到符合条件的数据。public static void Main()/1.定义int类型的数组(新建数据源)int numbers=new int-12,0,31,22,27,14,6;/2.创建查询 var numQuery=from n in numbers where n 0&n%2=0 select n;/3执行查询foreach(var num in numQuery)Console.WriteLine(num);注意:定义
8、查询后,查询直到需要枚举结果时才被真正执行,这种方式称为“延迟执行(deferred execution)”。-11-LINQ查询关键字 LINQ是一门查询语言,和SQL类似,也是通过一些关键字的组合实现最终的查询。LINQ查询常用的关键字:关键字关键字功能描述功能描述From子句指定数据源或范围变量Where子句指定条件,用来筛选数据源Select子句执行查询后,返回元素所包含的内容Group By子句对查询结果进行分组Order By子句对查询结果进行排序Join子句根据指定条件来连接两个数据源into关键字用于创建一个临时标识符,存放Group、Join或Select子句的结果Let子句
9、用于存储查询表达式中子表达式结果-12-LINQ查询语句必须以From子句开始,后面紧跟要查询的数据源。From子句的语法格式:p element是必需的,这是一个范围变量,用于循环访问集合的元素,必须为可枚举类型。该范围变量用于在查询循环访问collection时,引用collection的每个成员。p collection是必需的。这是引用要查询的集合,必须为可枚举类型。例如:From子句 from element In collectionvar numQuery=from num in numbers-13-Where子句根据指定的条件对数据源中数据进行筛选。Where子句的语法格式:
10、p condition是一个表达式,该表达式的计算结果必须为Boolean值或Boolean值的等效值。如果条件的计算结果为True,则在查询结果中包含该元素;否则从查询结果中排除该元素。例如:Where子句 Where conditionvar numQuery=from num in numbers _where num 0where num%2=0select num查询查询number数组中大于数组中大于0且是偶数的数,此处用两且是偶数的数,此处用两个个Where子句来实现子句来实现 -14-Select子句用于选择数据,指定所返回元素的形式和内容。Select子句的语法格式:例如:注
11、意:LINQ查询语句必须以Select子句或Group子句结束。Select子句 select elementvar londonCusts3=from cust in customers _where cust.City=Londonselect cust-15-Group By子句可以根据元素的一个或多个字段对查询结果中的元素进行分组。Group By子句的语法格式:p listField1、listField2是可选的,用于指明查询变量的一个或多个字段,这些查询变量显式标识要包括在分组结果中的字段。如果未指定任何字段,则查询变量的所有字段都包括在分组结果中。p keyExp1是必需的,这
12、是一个表达式,标识用于确定元素的分组的键。可以指定多个键来形成一个组合键。p keyExp2是可选的,是一个或多个附加键,与keyExp1组合在一起,创建一个组合键。p aggregateList是必需的,是一个或多个表达式,标识如何对组进行聚合。若要为分组结果标识一个成员名称,可以使用Group关键字。例如:Group By子句 group listField1,listField2.by keyExp1,keyExp2.var studentsByYear=from student in studentsgroup student by student.Yearforeach(var ye
13、arGroup in studentsByYear)Console.WriteLine(Year:+yearGroup.year)foreach(var student in yearGroup)Console.WriteLine(Name:+student.Name)-16-Order By子句可以根据元素的一个或多个字段对查询结果中的元素进行排序。Order By子句的语法格式:p orderExp1是必需的,这是当前查询结果中的一个或多个字段,用于标识对返回值进行排序的方式,字段名称必须以逗号(,)分隔。p Ascending或Descending关键字指定对每个字段进行升序或降序排序。
14、如果未指定Ascending和Descending关键字,则默认排序顺序为升序。p 排序字段的优先级从左到右依次降低。例如:Order By子句orderby orderExp1 Ascending|Descending ,orderExp2.var londonCusts5=from cust in customerswhere cust.City=Londonorderby cust.Name Ascendingselect new Name=cust.Name,Phone=cust.Phone-17-在.NET4.0中,dynamic关键词是一个很重要的特性,用它可以创建动态对象并在运行
15、时再决定它的类型例如:dynamic新关键词dynamic dyn=1;Console.WriteLine(dyn.GetType();dyn=1.234;Console.WriteLine(dyn.GetType();dyn=hollowrod;Console.WriteLine(dyn.GetType();-18-可选或默认参数 在.NET4.0中,可以在定义方法的时候为参数指定一个默认值。调用方法的时候可以像平时那样传入参数,也可以直接跳过不传入参数,这样就会使用默认值传到方法里:public class DefautParam public static void Main(strin
16、g args)TestMethod(3);public static void TestMethod(int id,string name=张三)Console.WriteLine(id:0,name:1,id,name);-19-命名参数 在之前版本的C#中,方法定义的参数必须与方法调用时参数顺序一致,而现在,这个规矩可以被打破了,可以随便什么顺序传入,这在一定程度上提高了代码的可读性public class NameingParamDemo public static void Main(string args)TestMethod(str:李四);public static void T
17、estMethod(int id=4,string str=张三)Console.WriteLine(id:0,name:1,id,str);-20-推断数据类型允许声明变量时不使用As子句显式声明类型,而是由编译器通过初始化表达式的类型来推断出变量的类型 使用扩展方法可以从某个数据类型外部向该类型添加方法,扩展方法可以像该数据类型的普通实例方法那样进行调用 对象初始化器提供了一种简单的、对类的对象进行初始化的方式,它可以在单个语句中调用类的构造函数并设置属性的值 使用匿名类可以不对类进行定义而直接创建实例,编译器会根据声明时指定的属性来创建类的定义小结-1-21-小结-2 LINQ(Language Integrated Query)是语言集成查询的简称 LINQ查询分为3步:新建数据源、创建查询和执行查询 LINQ查询常用的关键字如:From子句、Where子句、Select子句、Group By子句、Order By子句 使用dynamic、可选参数和命名参数谢 谢 Thanks for listening.