這是第二次遇到 Lambda 的程式碼,

上一次有初步的了解,結果現在還是忘記了,

 

這次我很認真的花了一個早上的時間弄懂,

Lambda 比較好理解的方式,把它當成是委派函式的定義。

這是我上次理解到最後的觀念,但是光了解這樣還不夠,所已才會又看不懂。

 

若要看懂這篇文章,請先去弄懂委派函式,

函式通常有分有回傳值、沒回傳值、有帶引數、沒帶引數,

因此必須先研究要丟到哪種結構的委派函式,

 

以 x => x*x 舉例,
【=>】前面是引數,
【=>】後面是程式、回傳值。
兩個以上引數或沒有引數時,要用括號
() => 100;
(x,y) => x*y;

 

VS有些訂義好一些委派函式
EX:

System.Action (多載,可帶0~16個引數,不回傳值)

System.Func (多載,可帶0~16個引數(不含TResult),需回傳值)

 

//---------------------------------
//用delegate System.Func 示範1
//TResult Func<T1, TResult> 說明:
//輸入T1 回傳 TResult
//---------------------------------

//Lambda 表示:
Func<int, int> square = x => x * x;
Console.WriteLine(square(5));


//一般程式表示:
private int GetSquare(int x)
{
    return x * x;
}
Func<int, int> square = GetSquare;
Console.WriteLine(square(5));


//---------------------------------
//用delegate System.Func 示範2
//TResult Func<T1, TResult> 說明:
//輸入T1 回傳 TResult
//---------------------------------

//Lambda 表示:
Func<string, int> length = x => x.Length;
Console.WriteLine(length("test"));

//一般程式表示:
private int GetLength(string str)
{
    return str.Length;
}
Func<string, int> length = GetLength;
Console.WriteLine(length("test"));

//---------------------------------
//用delegate System.Predicate 示範1
//bool Predicate<T> 說明:
//List.Find 傳入值需要帶 Predicate<T>
//Predicate<T>其實就是搜尋的條件,但只找第一個
//System.Predicate<Point>
//說明如何在List 中找符合Predicate<T>條件的 Point 
//下面示範找面積大於100000的Point
//---------------------------------

List<Point> points = new List<Point>();
points.Add(new Point(100, 200));
points.Add(new Point(150, 250));
points.Add(new Point(250, 375));
points.Add(new Point(275, 395));
points.Add(new Point(295, 450));


//Lambda 表示:
Predicate<Point> predicate = point => point.X * point.Y > 100000;
Point first = points.Find(predicate);
Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);

//一般程式表示:
private static bool FindPoints(Point obj)
{
    return obj.X * obj.Y > 100000;
}
Predicate<Point> predicate = FindPoints;
Point first = points.Find(predicate);
Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);

//---------------------------------
//用delegate System.Predicate 示範2
//bool Predicate<T> 說明:
//Array.Find 傳入值需要帶 Predicate<T>
//Predicate<T>其實就是搜尋的條件,但只找第一個
//System.Predicate<Point>
//說明如何在Array 中找符合Predicate<T>條件的 Point 
//下面示範找面積大於100000的Point
//---------------------------------

Point[] points = 

    new Point(100, 200), 
    new Point(150, 250), 
    new Point(250, 375), 
    new Point(275, 395), 
    new Point(295, 450) 
};
//Lambda 表示:
Predicate<Point> predicate = point => point.X * point.Y > 100000;

//一般程式表示:
private static bool FindPoints(Point obj)
{
    return obj.X * obj.Y > 100000;
}
Predicate<Point> predicate = FindPoints;
Point first = Array.Find(points, predicate);
Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);

//---------------------------------
//delegate System.Predicate 格式說明
//bool Predicate<T>
//只能丟一個引數,判斷結果後回傳布林值,
//若不使用Lambda,要在自訂義的委派函式中判斷其他數值,
//例如上面不想固定判斷>100000
//就必須用共用變數的方式
//---------------------------------

//一般程式表示:
private static int A = 100000;
private static bool FindPoints(Point obj)
{
    return obj.X * obj.Y > A;
}
Predicate<Point> predicate = FindPoints;
Point first = Array.Find(points, predicate);
Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);

 

//---------------------------------
//delegate System.Action 格式說明
//void Action(void)
//沒有引數、沒有回傳值
//單純只做某件事情
//---------------------------------

//Lambda 表示:
Action method = () => Console.WriteLine("Hello World.");
method();

//一般程式表示:
private void DoSomething()
{
    Console.WriteLine("Hello World.");
}
Action method = DoSomething;
method();

arrow
arrow
    文章標籤
    C C#
    全站熱搜
    創作者介紹
    創作者 史克威爾凱特 的頭像
    史克威爾凱特

    史克威爾凱特的部落格

    史克威爾凱特 發表在 痞客邦 留言(0) 人氣()