程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 3.0特性之Lambda表達式

C# 3.0特性之Lambda表達式

編輯:C#入門知識

Lambda表達式是MS在C# 3.0中引入的。Lambda表達式最早可見於LISP語言,美國數學家Alonzo Church在1936年將其概念化。這種表達式為描述算法提供了一種簡便的手段。
在引入Lambda表達式之前,我們先看一看在這之前,將一個算法作為參數傳遞給一個方法是如何做到的。
使用命名方法(Named Methods)

在C# 2.0之前,可以使用委托(delegate)來完成這項工作。比如考慮這樣一個應用,對數組元素按照一定的規則進行過濾,對於通用模塊,可以寫成下面的樣子:

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

然後搞算法的人就把過濾算法寫成函數,比如下面的這樣:

public class Application
{
    public static bool IsOdd(int i)
    {
        return ((i & 1) == 1);
    }
}

這個IsOdd()方法,就是描述算法的named method。在實際的調用過程中,caller調用的是Common類的FilterArrayOfInt()方法,該方法的第二個參數,就是一個過濾器算法的委托(函數指針)。所有的過濾器算法必須是具有相同的參數和返回值類型。在調用FilterArrayOfInt()方法的時候,同時把描述算法的IsOdd()作為參數,代入委托,這樣一個事件就搞定了。

static void Main(string[] args)
{
    int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int[] oddNums = Common.FilterArrayOfInt(nums, Application.IsOdd);

    foreach (int i in oddNums)
    {
        Console.WriteLine(i);
    }
}

結果當然是1、3、5、7、9。算法的實現者可以寫出各種不同的filter,如此代入即可。
使用匿名方法(Anonymous Methods)

在C# 2.0中,引入了匿名方法,可以將代碼內聯來替換委托。上面的示例中Main()方法裡的oddNums賦值可以改寫如下:
int[] oddNums = Common.FilterArrayOfInt(nums, delegate(int i) { return ((i & 1) == 1); });
在委托參數的地方可以簡單地用這種內聯的形式,由於沒有定義一個確定名稱的方法,就稱作匿名方法。對於不怎麼需要復用的代碼,這種手段可以極大簡化程序結構,但降低了可讀性。對於比較復雜的函數體就很suck了。。
使用Lambda表達式

Lambda表達式的一般形式,是由一組由逗號分隔的參數列表,跟著一個lambda操作符,再跟著一個表達式或者語句塊。多個輸入參數的情況下需要用括號來包圍。在C#中,lambda操作符是=>,因此,在C#中的lambda表達式應該是這個樣子的:

(param1, param2, …paramN) =>
{
statement1;
statement2;

statementN;
return(lambda_expression_return_type);
}

 

再回過頭看delegate的部分,一個delegate實際上就是指定了輸入的參數格式以及返回值的格式,那麼在lambda表達式中,就對應著=>左邊的那一坨以及語句體裡return的那個東東。在前面的例子中,輸入是一個int型數據,返回一個bool量,比如:
x=>x.Length>0
這個表達式可以讀作“x goes to x.Length >0”,或者“輸入x,返回x.Length>0”。下面的lambda表達式可以返回輸入參數的長度:
s=>s.Length
那麼delegate就應該指定返回int型值。對於多個輸入變量的,比如:
(x,y) => x==y
再復雜一點的:

(x, y) =>
{
if (x > y)
return (x);
else
return (y);
}

好,下面我們來改造前面的那個例子,算法設計者所設計的lambda表達式必須滿足委托的聲明: 
delegate bool IntFilter(int i);www.2cto.com
則可以將oddNums的賦值寫成這樣:
int[] oddNums = Common.FilterArrayOfInt(nums, i => ((i & 1) == 1));
結果當然也會和前面完全一樣。


作者:GUMINCONG

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved