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表达式介绍的更多相关文章

  1. Linq学习系列-----1.1 Lambda表达式介绍

     1.1  Lambda表达式介绍 下图就是一个典型的Lambda表达式. instance:输入参数 =>:Lambda操作符 instance.MemoryCount>=20*1024 ...

  2. c/c++ lambda 表达式 介绍

    lambda 表达式 介绍 问题:假设有个需求是,在vector<string>找出所有长度大于等于4的元素.标准库find_if函数的第三参数是函数指针,但是这个函数指针指向的函数只能接 ...

  3. Java8新特性: lambda 表达式介绍

    一.lambda 表达式介绍 lambda 表达式是 Java 8 的一个新特性,可以取代大部分的匿名内部类,简化了匿名委托的使用,让你让代码更加简洁,优雅. 比较官方的定义是这样的: lambda ...

  4. java语言中的匿名类与lambda表达式介绍与总结 (Anonymous Classes and Lambda Expressions)

    2017/6/30 转载写明出处:http://www.cnblogs.com/daren-lin/p/anonymous-classes-and-lambda-expressions-in-java ...

  5. Lambda表达式介绍(转)

    刚开始学lambda,lambda与linq的联合使用. Lambda表达式实际上是一个匿名函数.它包含表达式和语句,常用于创建委托或表达式目录树类型.所有Lambda表达式都是用Lambda运算符- ...

  6. Java 8 Lambda表达式介绍

    Lambda是什么? Lambda是一个匿名函数,我们可以把Lambda理解为是一段可以传递的代码.可以写出简洁.灵活的代码.作为一种更紧凑的代码风格,使java的语言表达能力得到提升. 可以这么说l ...

  7. JAVA 8 Lambda表达式-Lambda Expressions

    Lambda表达式介绍 Lambda表达式是在java规范提案JSR 335中定义的,Java 8 中引入了Lambda表达式,并被认为是Java 8最大的新特性,Lambda表达式促进了函数式编程, ...

  8. java8新增特性(一)---Lambda表达式

    Lambda表达式也成为闭包,是java语言层次上的改变,Lambda同意把函数作为一个方法的參数(函数作为參数传递进方法中),或者把代码看成数据.函数式程序猿对这一概念非常熟悉. 在JVM平台上有非 ...

  9. 一文搞懂Java8 Lambda表达式(附带视频教程)

    Lambda表达式介绍 Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁.通过Lambda表达式,可以替代我们以前经常写的匿名内部类来实现接口.Lambda表达式本质是一个 ...

随机推荐

  1. 解决getElementsByClassName兼容问题

    getElementsByClassName这个方法很常用,但是只有较新的浏览器才兼容,所以我们需要自己写个方法,解决这个问题,使它能够兼容各个浏览器. function getElementsByC ...

  2. VS编译wxWidgets

    准备工作 下载wxWidgets源码包(官网),我用的是3.02版: 安装Visual Studio.我用的是VS 2015 RC: 编译源码 解压wxWidgets的源码包,会得到一大堆文件.进入b ...

  3. Documention

    Object.bool Does the object exist? Object.name Components share the same name with the game object a ...

  4. Devstack single node Installation on VM

    Last three days, I want to install devstack on my virtual machine on Vmware Workstation.The VM'syste ...

  5. 360度角转AS3角度

    var ang:Number=400; ang=ang%360; //as3角指0~180,0~-180的角 //1. 360度角转as3角 if(ang>180)ang-=360; else ...

  6. System.InvalidOperationException nested transactions are not supported

    如下bll方法,在执行时会报事务嵌套异常.bll方法里开启了分布式事务,dal方法里又启动了数据库事务.通过查看异常堆栈,发现异常是在执行BillsDal.Add(bill);方法里的var tran ...

  7. Android设置对话框去除黑边

    在res/values/styles.xml文件中添加如下内容 <style name="dialog" parent="@android:style/Theme. ...

  8. MySQL5.5安装出现CMake错误找不到CMakelists.txt原因

    今天虚拟机上测试安装 CentOS6.3 + PHP5.4.8 + MySQL5.5.28,结果捣鼓了半天 MySQL都没装上,老是CMake目录下找不到那个 lists 文件,郁闷的不行,最后发现问 ...

  9. hdu1008

    //c++// #includeusing namespace std;int main(){int n,j,t,start;while (cin >> n,n){start =0;t = ...

  10. 《Windows编程循序渐进》——MFC封装机制详解

    单文档