網頁

2015年10月13日 星期二

C# Lambda 運算式

Last Update: 2015/10/13 21:17+08
Type: Note



Intro

咱是把它歸類為一個好用的撰寫方法
雖然並非必要, 但 不用它, 會累死人
x => x * x
() => Console.WriteLine("no parameter function");
(int x, string s) => s.Length > x
在 C# 裡看到這些的話, 都是 lambda






Context

MSDN開宗明意: lambda 運算式是匿名函式,可用來建立委派或運算式樹狀架構類型。
如下所示, way-1 是不使用 lambda, 會多寫一個方法, way-2 可以少寫一個
各位看倌可能會覺得多一個少一個沒什麼差, 但多一百個跟少一百個就差很多了:)
尤其是在用別人的library時, 就是想要方便點, 卻要預先宣告一堆東西
最糟的是, 如果整個程式只出現一次!? 所以匿名工作很重要喔
delegate int del(int i);
static int square(int i) { return i * i; }

static void Main(string[] args)
{
 //way-1
 del myDelegate = square;
 Console.WriteLine(myDelegate(5)); //j = 25
 //way-2
 myDelegate = x => x * x * x;
 Console.WriteLine(myDelegate(5));

 Console.ReadKey();
}

來個簡單的例子, 你需要一個thread做事
static void Main(string[] args)
{
 var thd = new System.Threading.Thread(
  delegate(){
   for (int i = 0; i < 10; i++)
   {
    Console.WriteLine("i= "+i);
   }
  }
 );
 thd.Start();
 Console.ReadKey();
}
thread裡面那段程式, 好死不死的, 只會在整個程式中出現一次
何不輕鬆寫在這就好了呢~

再稍微看一下撰寫方式
"x => x * x * x" 可以寫成 "(int x) => x * x * x;"
傳入參數只有一個時, 可以省略小括號
當然就可以寫成 () => Console.WriteLine("no parameter function");



講到這邊, 不得不介紹兩個好用的泛型委派 Action 和 Func
Action 是給 void I_am_a_action() 使用, 沒傳入值也沒回傳值, 僅僅只是動作
Func<byte, char> 是指 char byteToChar(byte b) 使用
static void Main(string[] args)
{
 Action act = () => Console.WriteLine("I am a action");
 Func byteToChar = (byte b) => (char)b;

 act();
 Console.WriteLine(byteToChar(97));

 Console.ReadKey();
}
有這兩個, 大部份的委派都可以不用寫了~
有沒有很好用!XD



運算式的寫法 "x => x * x" 是自動將整個式子的運算結果回傳的
如果想寫陳述式, 就是一行行的code, 就改成大括號
Func byteToChar = (byte b) => { return (char)b; };



Reference

MSDN Lambda 運算式


沒有留言:

張貼留言