[C#]Lambda表达式和Where语法
2017-06-03 17:32
363 查看
之前一直以为C#中Lambda表达式和Where语法很神圣,看人家写出一串这样的代码出来都感觉好高深,其实只是不敢接触而已,然后今晚看了一下,仔细理解一下也很简单!
看例子:
运行效果图:
Where语法格式
TSource source中元素的类型
source类型:System.Collections.Generic.IEnumerable<TSource>
要筛选的 IEnumerable<T>。
predicate类型:System.Func<TSource,Boolean>
用于测试每个元素是否满足条件的函数。
一般where都是跟Lambda表达式一起使用的,where语法包含在Linq命名空间下,那何为Lambda表达式呢,简单的说就是匿名函数,也跟匿名委托差不多,所以没必要想的很神圣。
Lambda表达式例子:
运行结果是:30
估计很容易看明白。
Lambda表达式规则:
表达式位于=>运算符的右侧 (input parameters)=>expression
当Lambda只有一个输入参数的时候,括号才是可选的,否则括号是必须的。
例如:(x,y)=>x==y
有时候当编译器无法判断类型的时候,出现这种情况,你可以显式指定参数类型
例如:(int x,string y)=>s.length > x
当使用空括号表示指定0个参数
例如:()=>SomeMethod()
Lambda第二个小例子:
其实理解了委托和事件就很容易理解这个Lambda,说白了就是匿名委托,再直白一点就是匿名函数。表示已经无法再直白的说下去了。
在介绍稍微复杂一点的Lambda表达式
上面声明的表达式,是以int类型作为参数,然后做一个比较,返回的是一个bool值。
如果参数是Expression<Func>时,你也可以提供Lambda表达式例如在
System.Linq.Queryable 内定义的标准查询运算符中。 如果指定 Expression<Func> 参数,lambda
将编译为表达式目录树。
此处显示了一个标准查询运算符,Count 方法:
计算出数组中基数的个数
再来个复杂点的例子,就是循环判断,知道不满足条件停止,类似于do while的结构
看例子:
csharpcode:
[code]01 | using System; |
02 | using System.Collections.Generic; |
03 | using System.Linq; |
04 |
05 |
06 |
07 | namespace Lambda |
08 | { |
09 | class Program |
10 | { |
11 | delegate int del( int i); |
12 | static void Main( string [] args) |
13 | { |
14 | List< string > fruits = |
15 | new List< string > { "apple" , "passionfruit" , "banana" , "mango" , |
16 | "orange" , "blueberry" , "grape" , "strawberry" }; |
17 |
18 | IEnumerable< string > query = fruits.Where(fruit=> fruit.Length < 6); //Where语法要引入Linq引用 |
19 |
20 | foreach ( string fruit in query) |
21 | { |
22 | Console.WriteLine(fruit); |
23 | } |
24 | } |
25 | } |
Where语法格式
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource,bool> predicate
)
类型参数
TSource source中元素的类型
参数
source类型:System.Collections.Generic.IEnumerable<TSource>要筛选的 IEnumerable<T>。
predicate类型:System.Func<TSource,Boolean>
用于测试每个元素是否满足条件的函数。
一般where都是跟Lambda表达式一起使用的,where语法包含在Linq命名空间下,那何为Lambda表达式呢,简单的说就是匿名函数,也跟匿名委托差不多,所以没必要想的很神圣。
Lambda表达式例子:
csharpcode:
[code]01 | using System; |
02 |
03 | namespace Lambda |
04 | { |
05 | class Program |
06 | { |
07 | //声明委托类型 |
08 | delegate int del( int i); |
09 | static void Main( string [] args) |
10 | { |
11 | //定义一个委托事件 |
12 | del myDelegate = x => x * 6; |
13 | int j = myDelegate(5); |
14 | Console.Write(j); |
15 |
16 | Console.Read(); |
17 | } |
18 | } |
19 | } |
估计很容易看明白。
Lambda表达式规则:
表达式位于=>运算符的右侧 (input parameters)=>expression
当Lambda只有一个输入参数的时候,括号才是可选的,否则括号是必须的。
例如:(x,y)=>x==y
有时候当编译器无法判断类型的时候,出现这种情况,你可以显式指定参数类型
例如:(int x,string y)=>s.length > x
当使用空括号表示指定0个参数
例如:()=>SomeMethod()
Lambda第二个小例子:
其实理解了委托和事件就很容易理解这个Lambda,说白了就是匿名委托,再直白一点就是匿名函数。表示已经无法再直白的说下去了。
在介绍稍微复杂一点的Lambda表达式
上面声明的表达式,是以int类型作为参数,然后做一个比较,返回的是一个bool值。
如果参数是Expression<Func>时,你也可以提供Lambda表达式例如在
System.Linq.Queryable 内定义的标准查询运算符中。 如果指定 Expression<Func> 参数,lambda
将编译为表达式目录树。
此处显示了一个标准查询运算符,Count 方法:
计算出数组中基数的个数
再来个复杂点的例子,就是循环判断,知道不满足条件停止,类似于do while的结构
相关文章推荐
- [C#]Lambda表达式和Where语法
- 步步为营VS 2008 + .NET 3.5(4) - C# 3.0新特性之LambdaExpressions(Lambda表达式)、QuerySyntax(查询语法)和AnonymousTypes(匿名类型)
- 步步为营VS 2008 + .NET 3.5(4) - C# 3.0新特性之LambdaExpressions(Lambda表达式)、QuerySyntax(查询语法)和AnonymousTypes(匿名类型)
- C#中的Where和Lambda表达式
- C#语法之匿名函数和Lambda表达式
- C#语法小知识(十二)匿名方法与Lambda表达式
- 4、步步为营VS 2008 + .NET 3.5(4) - C# 3.0新特性之LambdaExpressions(Lambda表达式)、QuerySyntax(查询语法)和AnonymousTypes(匿名类型)
- C#中的Where和Lambda表达式
- C#中的Where和Lambda表达式
- 步步为营VS 2008 + .NET 3.5(4) - C# 3.0新特性之LambdaExpressions(Lambda表达式)、QuerySyntax(查询语法)和AnonymousTypes(匿名类型)
- [深入学习C#]LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询
- VB C# 语法对比图
- VB.NET and C# Comparison(VB.NET and C# 语法比较)
- C++/CLI与C#常用语法对比(转)
- C#笔记(3)---基本语法[程序结构]
- C#笔记(1)--->基本语法 [运算符]
- 【转贴】在BCB中实现类C#属性声明语法
- C# VB 语法对比图 [转载]
- VB.NET and C# 语法比较手册
- C# 2.0对现有语法的改进