C#Lambda表达式详细总结
(⼀)输⼊参数
在Lambda表达式中,输⼊参数是Lambda运算符的左边部分。它包含参数的数量可以为0、1或者多个。只有当输⼊参数为1时,Lambda表达式左边的⼀对⼩括弧才可以省略。输⼊参数的数量⼤于或者等于2时,Lambda表达式左边的⼀对⼩括弧中的多个参数质检使⽤逗号(,)分割。
⽰例1
下⾯创建⼀个Lambda表达式,它的输⼊参数的数量为0.该表达式将显⽰“This is a Lambda expression”字符串。
[csharp]
01. ()=>Console.WriteLine("This is a Lambda expression.");
分析2
由于上述Lambda表达式的输⼊参数的数量为0,因此,该Lambda表达式的左边部分的⼀对⼩括弧不能被省略。
⽰例2
下⾯创建⼀个Lambda表达式,它的输⼊参数包含⼀个参数:m。该表达式将计算m参数与2的乘积。
[csharp]
01. m=>m*2;
分析2
上述Lambda表达式的输⼊参数省略了⼀对⼩括弧,它与“(m)=>m*2”Lambda表达式是等效的。
⽰例3
下⾯创建⼀个Lambda表达式,它的输⼊参数包含两个参数:m和n。该表达式将计算m和n参数的乘积。
[csharp]
01. (m,n)=>m*n;
(⼆)表达式或语句块
多个Lambda表达式可以构成Lambda语句块。语句块可以放到运算符的右边,作为Lambda的主体。根据主题不同,Lambda表达式可以分为表达式Lambda和语句Lambda。语句块中可以包含多条语句,并且可以包含循环、⽅法调⽤和if语句等。
⽰例1
下⾯创建⼀个Lambda表达式,它的右边部分是⼀个表达式。该表达式计算m参数的平⽅值。
[csharp]
01. m=>m*n;
分析1
如果Lambda表达式的右边部分是⼀个语句块,那么该语句块必须被"{"和"}"包围。
⽰例2
下⾯创建⼀个Lambda表达式,它的输⼊参数包括两个参数:m和n。该表达式的右边包含2个表达式;第⼀个表达式计算m和n参数的乘积,结果保存为result变量;第⼆个表达式显⽰result变量的值。
[csharp]
01. (m,n)=>{int result=m*n; Console.WriteLine(result);}
分析2
上述Lambda表达式的右边部分包含2个表达式,因此,该表达式的右边部分必须被"{"和"}"包围。
(三)查询表达式
查询表达式是⼀种使⽤查询语法表⽰的表达式,它⽤于查询和转换来⾃任意⽀持LINQ 的数据源中的数据。查询表达式使⽤许多常见的C#语⾔构造,易读简洁,容易掌握。它由⼀组类似于SQL 或XQuery 的声明性语法编写的⼦句组成。每⼀个⼦句可以包含⼀个或多个C#表达式。这些C#表达式本⾝也可能是查询表达式或包含查询表达式。
●查询表达式必须以from ⼦句开头,以select 或group ⼦句结束。第⼀个from ⼦句和最后⼀个select ⼦句或group ⼦句之间,可以包含⼀个活多个where ⼦句、let ⼦句、join ⼦ 句、orderby ⼦句和group ⼦句,甚⾄还可以是from ⼦句。它包括8个基本⼦句,具体说明如下所⽰。●from ⼦句:指定查询操作的数据源和范围变量。
●select ⼦句:指定查询结果的类型和表现形式。
●where ⼦句:指定筛选元素的逻辑条件。
●let ⼦句:引⼊⽤来临时保存查询表达式中的字表达式结果的范围变量。
●orderby ⼦句:对查询结果进⾏排序操作,包括升序和降序。
●group ⼦句:对查询结果进⾏分组。
●into ⼦句:提供⼀个临时标识符。join ⼦句、group ⼦句或select ⼦句可以通过该标识符引⽤查询操作中的中坚结果。
●join ⼦句:连接多个⽤于查询操作的数据源。
⽰例1
下⾯创建⼀个查询表达式query ,该查询表达式查询arr 数组中的每⼀个元素。
int[]arr =new int[]{0,1,2,3,4,5,6,7,8,9};
分析1
lambda编程⽰例2
下⾯创建⼀个查询表达式query2.该查询表达式查询arr 数组中⼤于6的元素。
分析2变量只是保存查询操作,⽽不是查询的结果。当查询表达式执⾏查询操作时,才会计算该查询表达式的结果。以上两个变量的类型都属于集合类型。
(四)from ⼦句
from ⼦句⽤来指定查询表达式的数据源和范围变量。它是查询表达式的必有部分,并且它出现在最开始。数据源不但可以包括查询本⾝的数据源,⽽且还可以包括⼦查询的数据源。范围变量⽤来表⽰数据源序列中的每⼀个元素。
注意:from ⼦句指定的数据源的类型必须为IEnumerable ,IEnumerable<T>或⼀种派⽣类型。
⽰例1
下⾯创建⼀个查询表达式query 。该查询表达式查询arr 数组中的每⼀个元素。在query 查询表达式中,arr 数组为数据源,n 为范围变量。n 范围变量的类型arr 数据源的元素类型。
分析1
下⾯我们来学习数据源和包含不同的from ⼦句查询表达式。[csharp]
01. var query1=from n in arr 02. select n; [csharp]
01. int [] arr =new int []{0,1,2,3,4,5,6,7,8,9}; 02. var query2=from n in arr 03. where n >6 04. select n;
[csharp]
01. int [] arr =new int [] {0,1,2,3,4,5,67,8,9}; 02. var query =from n in arr 03. select n;
数据源:指定数据的来源,它的形式可以为静态数组、动态数组(Arraylist )、集合、数据集(DataSet )、数据表、MML ⽚段、MML ⽂件等。
如果数据源实现了IEnumerable<T>接⼝,那么编译器可以推断范围变量的类型为其元素类型。例如:数据源的类型为
IEnumerable<UserInfo>,那么可以推断出范围 变量的类型为UseInfo 。
⽰例2
下⾯创建⼀个查询表达式query 。该查询表达式查询list 反省数组中的每⼀个元素。在query 查询表达
式中,list 反省数组为数据源。u 为范围变量。u 范围变量的类型为list 数据源的元素类型(UserInfo )。
分析2
如果当数据源是⾮泛型IEnumerable 类型(如ArrayList 等)时,需要显⽰指定范围变量的类型。
⽰例3
下⾯创建⼀个查询表达式query 。该查询表达式查询list 数组中的每⼀个元素。在query 查询表达式中,list 数组为数据源,u 为范围变量。u 范围变量的类型被指定为list 数据源的元素类型(UserInfo )。
分析3
包含单个from ⼦句的查询表达式
在查询表达式中,from ⼦句⾄少有⼀个。当from ⼦句只有⼀个时,构成的查询表达式被称为包含单个from ⼦句的查询表达式。⼀般的,包含单个from ⼦句的查询表达式只包含⼀个数据源。
⽰例4
下⾯创建⼀个查询表达式query 。该查询表达式查询arr 数组中的每⼀个元素,它就是⼀个包含单个from ⼦句的查询表达式。
分析4
包含多个from ⼦句的查询表达式
在查询表达式中,当from ⼦句有两个或两个以上时,构成的查询表达式被称为包含多个from ⼦句的查询表达式。
⽰例5
下⾯创建⼀个查询表达式query 。该查询表达式包含两个from ⼦句,他们分别查询两个独⽴的数据源;arr1数组和arr2数组。最后,使⽤select ⼦句计算当前元素的和。
分析5[csharp]
01. List<UserInfo> list=... 02. var query =from u in list 03. select u; [csharp]
01. ArrayList list =new ArrayList(); 02. list.Add(...); 03. ... 04. var query =from UserInfo u in list 05. select u;
[csharp]
01. int [] arr =new int []{0,1,12,3,4,5,6,7,8,9}; 02. var query =from n in arr 03. select n;
包含符合from ⼦句的查询表达式
在查询表达式中,有可能查询表达式的数据源中的每⼀个元素本⾝也作为该查询表达式的数据源。那么要查询数据源中的每⼀个元素中的元素,则需要使⽤符合from ⼦句。符合from ⼦句类似于嵌套的foreach 语句。
⽰例6
下⾯创建⼀个名称为Test 的类,该类包含两个字段:Name 和AliasName 。其中,Name 字段的类型为string ,AliasName 字段的类型为string 类型列表。因此,它也可以作为⼦查询表达式的数据源。
分析6
⽰例7
下⾯创建⼀个查询表达式query 。该查询表达式包含了⼀个符合from ⼦句:第⼀个from ⼦句查询list
泛型集合;第⼆个from ⼦句查询list 集合中元素的AliasName 字段,为第⼀个from ⼦句的⼦查询。最后,使⽤select ⼦句将u 变量的Name 属性的值和name 变量的值拼接为⼀个字符串。分析7
(五)select ⼦句
select ⼦句⽤来指定将在执⾏查询时产⽣的值的类型。查询表达式必须以select ⼦句或group ⼦句结束。
⽰例1
下⾯创建⼀个查询表达式query 。该查询表达式查询arr 数组中的每⼀个元素。
分析1
⽰例2
下⾯创建⼀个查询表达式query 。该查询表达式查询arr 数组中的每⼀个元素和10的乘积。[csharp]
01. int [] arr1= new int [] {0,1,2,3,4,5,6,7,8,9}; 02. int [] arr2=new int [] {0,1,2,3,4,5,6,7,8,9}; 03. var query =from a in arr1 04. from b in arr2 05. select a +b;
[csharp]
01. public class Test 02. { 03. Public string Name; 04. Public List<string > AliasName; 05. }
[csharp]
01. List<MUserInfo> list =... 02. var query =from u in list 03. from name in u.AliasName 04. select u.Name+name;
[csharp]
01. int [] arr =new int [] {0,1,2,3,4,5,6,7,8,9}; 02. var query =from n in arr 03. select n;
[csharp]
01. int [] arr =new int [] {0,1,2,3,4,5,6,7,8,9}; 02. var query =from n in arr 03. select n*10;
分析2
select ⼦句中的“n*10”表达式决定了查询结果的表现形式,即计算每⼀个元素和10的乘积。
⽰例3
下⾯创建⼀个查询表达式query 。该查询表达式查询arr 数组中的每⼀个元素,查询结果是⼀个对象的集合对象包含两个属性:ID 和Name ,它在select ⼦句中由匿名对象初始化器创建。每⼀个对象的ID 属性的值是当前元素的值、Name 属性的值为元素的值的字符串的表现形式。分析3
(六)where ⼦句
where ⼦句⽤来指导将在查询表达式中返回数据源中的哪些元素。它将⼀个布尔条件应⽤于数据源中的每个元素,并返回指定条件的元素。查询表达式可以包含⼀个或多个where ⼦句。
⽰例1
下⾯创建⼀个查询表达式query 。该查询表达式从arr 数组中查询⼩于3的元素
分析1
上述where ⼦句只包含⼀个布尔表达式“n<3”,该表达式将筛选⼩于3的元素。
在⼀个where ⼦句中,也可以包含多个布尔表达式,各个表达式直接使⽤逻辑运算符(如&&和||)分隔。
⽰例2
下⾯创建⼀个查询表达式query 。该查询表达式从arr 数组中查询⼤于3且⼩于6的元素。
分析2
上述where ⼦句包含两个布尔表达式"n>3"和"n<6",它们共同指定将筛选⼤于3且⼩于6的元素。这两个布尔表达式使⽤&&运算符链接,即计算这两个布尔表达式的逻辑与。
where ⼦句不但可以包含布尔表达式,⽽且还可以包含返回布尔值的⽅法。
⽰例3
下⾯创建⼀个查询表达式query.该查询表达式从arr 数组中查询为偶数的元素。[csharp]
01. int [] arr =new int []{0,1,2,3,4,5,6,7,8,9}; 02. var query =from n in arr 03. select new 04. { 05. ID=n, 06. Name =n.ToString() 07. };
[csharp]
01. int [] arr =new int [] {0,1,2,3,4,5,6,7,8,9}; 02. var query =from n in arr 03. where n <3 04. select n;
[csharp]
01. int [] arr =new int []{0,1,2,3,4,5,6,7,8,9}; 02. var query =from n in arr 03. where n >3 && n<6 04. select n;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论