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
  • 相关阅读:
    友盟上报 IOS
    UTF8编码
    Hill加密算法
    Base64编码
    Logistic Regression 算法向量化实现及心得
    152. Maximum Product Subarray(中等, 神奇的 swap)
    216. Combination Sum III(medium, backtrack, 本类问题做的最快的一次)
    77. Combinations(medium, backtrack, 重要, 弄了1小时)
    47. Permutations II(medium, backtrack, 重要, 条件较难思考)
    3.5 find() 判断是否存在某元素
  • 原文地址:https://www.cnblogs.com/tian2010/p/2379655.html
Copyright © 2011-2022 走看看