zoukankan      html  css  js  c++  java
  • LINQ学前准备之Lambda Expressions

    Lambda表达式是C#3.0引进来的语法。Lambda表达式提供了匿名方法的备选方案。虽然Lambda主要用于LINQ操作,但是这种表达式也适用于,并且经常用于委托和事件。

    Lambda运算符

    Lambda采用了全新的运算符”=>”,”=>”为二元运算符,左边是输入参数,右边是Lambda主体。”=>”可描述成”转到”或“成为”.

    x=>x

    可读成x goes to x或input x return x

    让我们通过一个例子来看看命名方法、匿名方法、Lambda表达式的不同写法。

    假设我们有一个Int的数组,需要根据不同的过滤规则来返回所需要的数组。

    命名方法

    public class Common
    {
    	public delegate bool IntFilter(int i);//声明一个命名委托
    
    	public static int[] FilterArrayOfInt(int [] ints, IntFilter filter)//传入委托
    	{
    		ArrayList alist = new ArrayList();
    		foreach(int i in ints)
    		{
    			if(filter(i))
    			{
    				alist.Add(i);
    			}
    		}
    		return (int[])alist.ToArray(typeof(int));
    	}
    }
     
    此时,我们还需要新建一些IntFilter的类:
    public class Application
    {
    	public static bool IsOdd(int i)
    	{
    		return ((i & 1) == 1);
    	}
    }
     
    客户端调用:
    using System.Collections;
    int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int[] oddNums = Common.FilterArrayOfInts(nums, Application.IsOdd);
    foreach (int i in oddNums)
    	Console.WriteLine(i);

    当我们需要不同的filter的时候,我们需要新建一系列类似于Application.IsOdd的方法。

     

    匿名方法

    像上面的Application.IsOdd方法其实只会被客户端调用一次,同时,我们创建一系列的Application.IsOdd也挺烦的,要维护一系列的类。

    C# 2.0引入了匿名方法,匿名方法允许我们不需要创建类似Application.IsOdd方法,而是在需要传入委托方法的时候直接传入一个匿名的方法。

    int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int[] oddNums =
    Common.FilterArrayOfInts(nums, delegate(int i) { return ((i & 1) == 1); });
    foreach (int i in oddNums)
    	Console.WriteLine(i);
     
    采用这种方法,我们可以不需要再定义多余的Filter类。但是,这种方法的可读性比较差。
     
    Lambda表达式
     
    int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int[] oddNums = Common.FilterArrayOfInts(nums, i => ((i & 1) == 1));
    foreach (int i in oddNums)
    	Console.WriteLine(i);

    以下就是三种方式的具体差别:

    int[] oddNums = // using named method
    Common.FilterArrayOfInts(nums, Application.IsOdd);
    
    int[] oddNums = // using anonymous method
    Common.FilterArrayOfInts(nums, delegate(int i){return((i & 1) == 1);});
    
    int[] oddNums = // using lambda expression
    Common.FilterArrayOfInts(nums, i => ((i & 1) == 1));
     
    命名方法适用于当你的Filter需要可被重复使用的时候。而Lambda提供了更灵活的方式。
     
     
    Lambda表达式描述
    当Lambda表达式只有一个参数时,其通用形式为:
    param=>expr
     
    当Lambda表达式需要多个参数时,其通用形式为:
    (param-list)=>expr
     
    Note:当参数多余一个的时候,参数列表需要包括在圆括号里面。
     
    对于上面的例子,i => ((i & 1) == 1)我们可能会困惑,编译器如何知道参数及表达式的类型的呢?
    答案是:编译器根据FilterArrayOfInts需要的委托类型(在这个例子中,为IntFilter,他有一个int的输入参数,同时返回bool类型的值)来推断参数的类型和表达式的返回类型。
    因此,很重要的一点是:Lambda的参数和返回值类型必须与委托的参数类型和返回值类型相匹配。
     
    参考书目:Pro.LINQ.Language.Integrated.Query.in.Csharp.2010
  • 相关阅读:
    PTA 7-29 修理牧场(Huffman树)
    全网最详细最好懂 PyTorch CNN案例分析 识别手写数字
    【Python Deap库】遗传算法/遗传编程 进化算法基于python DEAP库深度解析讲解
    【比较】遗传算法GA和遗传编程GP有什么不同?
    【python(deap库)实现】GEAP 遗传算法/遗传编程 genetic programming +
    【比较】粒子群算法PSO 和 遗传算法GA 的相同点和不同点
    【遗传编程/基因规划】Genetic Programming
    【经典大数据竞赛科普】泰坦尼克灾难 到底是个什么东西
    【Python代码】TSNE高维数据降维可视化工具 + python实现
    【python代码】 最大流问题+最小花费问题+python(ortool库)实现
  • 原文地址:https://www.cnblogs.com/tian2010/p/2379655.html
Copyright © 2011-2022 走看看