不一樣的編碼風格 Lambda表示式

2022-04-06 11:19:29 字數 2364 閱讀 3406

lambda表示式也是c#3.0中最重要的特性之一。

1、lambda表示式的簡介

lambda表示式可以理解為乙個匿名方法,它可以包含表示式和語句,並且用於建立委託或轉換為表示式樹。在使用lambda表示式時,都會使用「=>」運算子,該運算子的左邊是匿名方法的輸入引數,右邊則是表示式或語句塊。

1.1 lambda表示式的演變過程

其實lambda表示式是匿名方法的投胎轉世。下面以**來鑑定:

1 c# 1.0

2 func delegatetest1=new func(callbackmethod);

34 c# 2.0

5 func delegatetest2=delegate(string

text)69

10 c# 3.0

11 func delegatetest3=(string text)=>text.length;

1213

可以省略引數型別string,從而將**再次簡化

14 func delegatetest4=(text)=text.length;

15此時也可以把圓括號省略

16 func delegatetest=text=>text.length;

以上**形象地掩飾了lambda表示式是如何由匿名方法演變而來的。

1.2 lambda表示式的使用

在實際開發過程中,委託的用途莫過於訂閱事件了。為了加深大家對lambda表示式的理解,這裡選擇演示用lambda表示式去訂閱事件。

1

namespace

lambda表示式2;

8 button1.click += (sender, e) => reportevent("

click事件

", sender, e);

9 button1.keypress += (sender, e) => reportevent("

keypress事件

", sender, e);10}

1112

private

static

void reportevent(string s, object

sender, eventargs eventargs)

1316

}17 }

從以上**可以看出,使用了c# 3.0的物件初始化器和lambda表示式後,**確實簡潔了不少。

2、表示式也有樹結構——表示式樹

lambda表示式除了可以用來建立委託外,還可以轉換成表示式樹。表示式樹(或稱「表示式目錄樹」)是用來表示lambda表示式邏輯的一種資料結構,它將**表示成乙個物件樹,而非可執行**。其實可以將表示式樹理解為一種資料結構,類似棧或佇列這種。

2.1 通過lambda表示式來構造表示式樹

1

namespace

表示式樹

2,引數2:");

1213

//獲取表示式樹的主體部分

14 binaryexpression body =(binaryexpression) expressiontree.body;

1516

//左節點(每個節點本身就是乙個表示式物件)

17 parameterexpression left =(parameterexpression) body.left;

1819

//右節點

20 parameterexpression right =(parameterexpression)body.right;

2122 console.writeline("

表示式樹主體為:");

23console.writeline(expressiontree.body);

24 console.writeline($"

表示式樹左節點為: 節點型別為: 表示式樹右節點為: 節點型別為:");

25console.readkey();

2627}28

}29 }

從以上**可以看出,通過lambda表示式來構造表示式樹的過程非常簡單,只需要把lambda表示式賦給乙個表示式樹變數就可以了。

2.2 如何把表示式樹轉換成可執行**

1

namespace

表示式樹22"

);14

console.readkey();15}

16}17 }

以上**通過expression類的compile()方法將表示式樹編譯成委託例項,然後通過委託呼叫的方式得到兩個數的和。

不一樣又不一樣的 木板接水

空地上豎立著n個從左到右排列的木板,它們可以把水擋住,但溢位最邊上木板的水將會流到空地上。已知木板間距都是單位1,現給定每個木板的高度,請求出總共能接住的水量?說明一點,這裡只考慮間距 寬度 和高度,不考慮第三個維度,因此水量是平方單位。木板高度分別是2,1,3,那麼我們可以接住2 2 4平方單位的...

我們不一樣

前輩們因自身實際的種種因素的影響而產生的認知,並不一定適用於我們自身。你可能從來不會去想乙個問題 你的觀點,來自 其實,它們絕大部分來自網路,它們或多或少地蠶食了你的判斷力。未來的路要怎麼走,沒有對與錯。有的,只是每乙個選擇所需要承擔的責任。我不想面臨,後之視今亦猶今之視昔的悲哀。我希望,未來回首,...

我們不一樣

這麼多年的兄弟 有誰比我更了解你 太多太多不容易 磨平了歲月和脾氣 時間轉眼就過去 這身後不散的筵席 只因為我們還在 心留在原地 張開手 需要多大的勇氣 這片天 你我一起撐起 更努力 只為了我們想要的明天 好好的 這份情好好珍惜 我們不一樣 每個人都有不同的境遇 我們在這裡 在這裡等你 我們不一樣 ...