• Lambda表达式介绍(转)


    刚开始学lambda,lambda与linq的联合使用。

    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);
            }
        }
    }
    View Code


    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);
                }
             }
        }
    }
    View Code


    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);
                }
            }
        }
    }
    View Code


    注意: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);
                }
    View Code

  • 相关阅读:
    vs2022 搭建NET6 WebApi 接口项目《五》 接口访问限流配置
    vs2022 搭建NET6 WebApi 接口项目《二》 配置swagger
    vs2022 搭建NET6 WebApi 接口项目《一》 整体项目搭建
    vs2022 搭建NET6 WebApi 接口项目《六》 返回参数配置
    vs2022 搭建NET6 WebApi 接口项目《三》 配置跨域
    Docker 在mac上的使用
    构建煤矿物联网大数据平台思路(1)
    构建煤矿物联网大数据平台思路(2)实时数据库与时序数据库
    Redis 只能通过127.0.0.1访问,磁盘在使用中等问题...
    git 提交忽略bin obj等文件
  • 原文地址:https://www.cnblogs.com/zlero/p/4359267.html
Copyright © 2020-2023  润新知