zoukankan      html  css  js  c++  java
  • 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);             }

  • 相关阅读:
    Handling Configuration Changes with Fragments
    Android基础——Fragment与Activity交互
    Android基础——Fragment与Activity交互
    Activity和Fragment生命周期对比
    Activity和Fragment生命周期对比
    移动端与PHP服务端接口通信流程设计(基础版)
    移动端与PHP服务端接口通信流程设计(基础版)
    ROW/COW 快照技术原理解析
    ROW/COW 快照技术原理解析
    OpenStack 实现技术分解 (5) 应用开发 — 使用 OpenStackClients 进行二次开发
  • 原文地址:https://www.cnblogs.com/armyfai/p/3532014.html
Copyright © 2011-2022 走看看