Lambda表达式介绍
Lambda表达式实际上是一个匿名函数。它包含表达式和语句,常用于创建委托或表达式目录树类型。所有Lambda表达式都是用Lambda运算符---------- =>,该运算符读为“goesto”。Lambda运算符的左边是输入参数(可能没有),右边是表达式或语句块。Lambda表达式返回右边表达式的结果。其基本格式如下:
(input paramenters)=>expression
其中,parameters是一个参数列表,在Lambda只有一个输入参数时可以不适用括号,否则括号是必须的。两个或更多输入参数由括在括号中的逗号分隔,如以下代码所示,包括两个参数x和y。
(x,y)=> x==y
通常Lambda表达式的参数都是可变类型的,由编译器自动确定它的具体类型。但有时编译器难于或无法推断输入类型,就需要为参数显示指定类型,既在参数之前添加参数类型。如下所示的Lambda表达式包括连个参数x和s。其中x是int类型,而s则是string类型。
(int x, string s) =>s.Length > x
当Lanbda表达式没有参数时,需要使用空的括号表示,如下所示。其中,“()”表示没有参数,而Amethod()是一个具体的方法,该方法的返回值就是Lambda表达式的结果。
() => AMethod()
由于Lambda表达式实际是匿名函数,它可以赋值到一个委托,而在IEnumerable<T>的方法中很多都通过函数委托来实现自定义的运算、条件等操作,所以Lambda表达式在Linq中被广泛使用。
常用实例:
1.用Where()方法进行筛选
using System;
using System.Linq;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
int[] intary = { 1, 2, 3, 4, 5, 6, 7, 8, 89, 10 };
//查询所有能被2整除的元素
var query1 = intary.Where(num => num % 2 == 0);
Console.WriteLine("Query1:");
foreach (var item in query1)
{
Console.WriteLine("{0}", item);
}
//查询所有值大于3被索引的元素
var query2 = intary.Where((num, index) => num > index * 3);
Console.WriteLine("Query2:");
foreach (var item in query2)
{
Console.WriteLine("{0}", item);
}
}
}
}
2.用OrderBy()方法进行排序
using System;
using System.Linq;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
int[] intary = { 1, 2, 3, 4, 5, 6, 7, 8, 89, 10 };
//对所有元素按照%10进行升序排列,这是默认的排序方式
var query1 = intary.OrderBy(val => val % 10 );
Console.WriteLine("Query1:");
foreach (var item in query1)
{
Console.WriteLine("{0}", item);
}
//对所有元素按照%10进行降序排列
var query2 = intary.OrderByDescending(val => val % 10);
Console.WriteLine("Query2:");
foreach (var item in query2)
{
Console.WriteLine("{0}", item);
}
}
}
}
以上的两个排序Demo都是采用默认的int排序比较器,在一些开发中,以下两种情况需要使用特定的数据比较器:
- 默认的数据类型不能满足特殊的比较需要
- 自定义的类不存在默认的数据比较器
using System;
using System.Linq;
using System.Collections.Generic;
namespace ConsoleApplication3
{
//自定义int类型比较器,实现IComparable<int>接口
class MyCompare : IComparer<int>
{
public int Compare(int x, int y)
{
int x1 = Math.Abs(x);
int y1 = Math.Abs(y);
if (x1 > y1)
{
return 1;
}
else if (x1 == y1)
{
return 0;
}
else
{
return -1;
}
}
}
class Program
{
static void Main(string[] args)
{
//实例化自定义比较器
MyCompare mc = new MyCompare();
int[] intary = { 1, -2, 3, -4, 5, -6, 7, -8, 9, -10 };
var query1 = intary.OrderBy(val => val, mc);
Console.WriteLine("Query1");
foreach (var item in query1)
{
Console.WriteLine("{0}",item);
}
}
}
}
3.用Skip()、SkipWhile()跳过元素
using System;
using System.Linq;
using System.Collections.Generic;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
int[] intary = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40 };
//跳过intAry中前3个元素
var query1 = intary.Skip(3);
Console.WriteLine("Query1");
foreach (var item in query1)
{
Console.WriteLine("{0}", item);
}
//跳过intAry中小于5的元素
var query2 = intary.SkipWhile(num => num < 5);
Console.WriteLine("Query2");
foreach (var item in query2)
{
Console.WriteLine("{0}", item);
}
}
}
}

4.用Take()、TakeWhile()提取元素
using System;
using System.Linq;
using System.Collections.Generic;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
int[] intary = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40 };
//取intAry中前3个元素
var query1 = intary.Take(3);
Console.WriteLine("Query1");
foreach (var item in query1)
{
Console.WriteLine("{0}", item);
}
//取intAry中小于5的元素
var query2 = intary.TakeWhile(num => num < 5);
Console.WriteLine("Query2");
foreach (var item in query2)
{
Console.WriteLine("{0}", item);
}
}
}
}
5.对元素进行数值计算
- Min():求最小值
- Max():求最大值
- Sum():求和
- Average():求平均值
using System;
using System.Linq;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
int[] intary = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40 };
var intMin = intary.Min();
var intMax = intary.Max();
var intSum = intary.Sum();
var intAverage = intary.Average();
Console.WriteLine("intary's min={0},max={1},sum={2},average={3}",intMin,intMax,intSum,intAverage);
string[] strAry = { "Kevin", "James", "Ken", "Ben" };
var strMin = strAry.Min();
var strMax = strAry.Max();
Console.WriteLine("strAry's Min = {0},Max={1}",strMin,strMax);
}
}
}
6.用Distinct()消除集合中相等的元素
using System;
using System.Linq;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
int[] intary = { 1,1, 2,2, 3, 3, 4, 5};
var query1 = intary.Distinct();
foreach (var item in query1)
{
Console.WriteLine(item);
}
}
}
}
7.用Concat()连接两个集合
using System;
using System.Linq;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
string[] strAry1 = {"Kevin","James","Ben"};
string[] strAry2 = { "Ken","Joanna","cc"};
var query1 = strAry1.Concat(strAry2);
Console.WriteLine("Query1");
foreach (var item in query1)
{
Console.WriteLine(item);
}
var query2 = strAry2.Concat(strAry1);
Console.WriteLine("Query2");
foreach (var item in query2)
{
Console.WriteLine(item);
}
}
}
}
注意:Concat()方法是直接将两个集合中的元素连接在一起,不会进行重新排序、过滤等,就算两个集合中元素有重复也同样保留。
8.集合操作
说到集合,很容易想起并集、交集、差集3种常用操作。在LINQ中,IEnumerable<T>类分别通过Union()、Intersect()、Except完成这3种操作()。
using System;
using System.Linq;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
int[] intAry1 = {1,2,3};
int[] intAry2 = {3,4,5};
var query1 = intAry1.Union(intAry2);
Console.WriteLine("并集");
foreach (var item in query1)
{
Console.WriteLine(item);
}
var query2 = intAry1.Intersect(intAry2);
Console.WriteLine("交集");
foreach (var item in query2)
{
Console.WriteLine(item);
}

Lambda表达式介绍的更多相关文章
- Linq学习系列-----1.1 Lambda表达式介绍
1.1 Lambda表达式介绍 下图就是一个典型的Lambda表达式. instance:输入参数 =>:Lambda操作符 instance.MemoryCount>=20*1024 ...
- c/c++ lambda 表达式 介绍
lambda 表达式 介绍 问题:假设有个需求是,在vector<string>找出所有长度大于等于4的元素.标准库find_if函数的第三参数是函数指针,但是这个函数指针指向的函数只能接 ...
- Java8新特性: lambda 表达式介绍
一.lambda 表达式介绍 lambda 表达式是 Java 8 的一个新特性,可以取代大部分的匿名内部类,简化了匿名委托的使用,让你让代码更加简洁,优雅. 比较官方的定义是这样的: lambda ...
- java语言中的匿名类与lambda表达式介绍与总结 (Anonymous Classes and Lambda Expressions)
2017/6/30 转载写明出处:http://www.cnblogs.com/daren-lin/p/anonymous-classes-and-lambda-expressions-in-java ...
- Lambda表达式介绍(转)
刚开始学lambda,lambda与linq的联合使用. Lambda表达式实际上是一个匿名函数.它包含表达式和语句,常用于创建委托或表达式目录树类型.所有Lambda表达式都是用Lambda运算符- ...
- Java 8 Lambda表达式介绍
Lambda是什么? Lambda是一个匿名函数,我们可以把Lambda理解为是一段可以传递的代码.可以写出简洁.灵活的代码.作为一种更紧凑的代码风格,使java的语言表达能力得到提升. 可以这么说l ...
- JAVA 8 Lambda表达式-Lambda Expressions
Lambda表达式介绍 Lambda表达式是在java规范提案JSR 335中定义的,Java 8 中引入了Lambda表达式,并被认为是Java 8最大的新特性,Lambda表达式促进了函数式编程, ...
- java8新增特性(一)---Lambda表达式
Lambda表达式也成为闭包,是java语言层次上的改变,Lambda同意把函数作为一个方法的參数(函数作为參数传递进方法中),或者把代码看成数据.函数式程序猿对这一概念非常熟悉. 在JVM平台上有非 ...
- 一文搞懂Java8 Lambda表达式(附带视频教程)
Lambda表达式介绍 Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁.通过Lambda表达式,可以替代我们以前经常写的匿名内部类来实现接口.Lambda表达式本质是一个 ...
随机推荐
- loadrunner破解方法--lm70.dll,mlr5lprg.dll下载地址
一.由于在压力测试执行中,出现一个-10803的错误 ,为解决这个错误,重新设置的环境变量,在次执行错误,这个问题解决了,但另外一个问题出来了,LR,打开脚本编辑器老提示找不到TEMP目录,当时没有想 ...
- C++中int转为char 以及int 转为string和string 转int和空格分隔字符串
1.对于int 转为char 直接上代码: 正确做法: void toChar(int b) { char u; ]; _itoa( b, buffer, ); //正确解法一 u = buffer[ ...
- Toast用法
应用场景:弹出提示信息 主界面: 代码如下: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(sa ...
- Scala学习---数组
1.编写一段代码,将a设置为一个n个随机整数的数组,要求随机数介于0(包含)和n(不包含)之间 /** * Created by vito on 2017/1/11. */ object ex1 { ...
- Windows下WordPress搭建博客过程
搭建环境:Win7 + XAMPP5.5 + wordpress4.5.1 官网下载安装包,解压,拷贝到网站根目录(D:\IT\XAMPP5.5\htdocs\),重命名为blog(随意) 创建数据库 ...
- PHP数据类型转换(字符转数字,数字转字符)
PHP的数据类型转换属于强制转换,允许转换的PHP数据类型有: (int).(integer):转换成整形 (float).(double).(real):转换成浮点型 (string):转换成字符串 ...
- MVC3+EF4.1学习系列(二)-------基础的增删改查和持久对象的生命周期变化
上篇文章中 我们已经创建了EF4.1基于code first的例子 有了数据库 并初始化了一些数据 今天这里写基础的增删改查和持久对象的生命周期变化 学习下原文先把运行好的原图贴来上~~ 一.创建 ...
- TortoiseGit - 分支管理 -增加分支
1.本地当前在master分支,右击选择Create Branch... 2.填写Branch的名称 3.右击选择Push,在Ref-Local,选择刚才新建的Branch名称 4.点击OK后,在弹出 ...
- app 一些常用的
发短信 :sms:10086 打电话:tel:10086 1.-webkit-tap-highlight-color:rgba(255,255,255,0)可以同时屏蔽ios和android下点击元素 ...
- clion idea jetbrain windows下搞c/c++
安装 clion 把MinGW(搜MinGW.zip)放到c盘根目录下 ok