這是第二次遇到 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();
留言列表