2009-07-30 56 views
0

如何將此C#2委託示例轉換爲C#3 lambda語法?


我有這個例子,我轉換 C#2委託例如:

Predicate<string> predicate2 = delegate(string n) 
{ 
    return n.StartsWith("J"); 
}; 
IList<string> namesWithJ2 = Tools.Filter(names, predicate2); 
Tools.Dump(namesWithJ2); 

C#3 lambda語法例如:

var filteredNames = Tools.Filter(names, n => n.StartsWith("J")); 
Tools.Dump(filteredNames); 

但如何我將其轉換爲lambda語法?特別是,如何使用「=>」傳遞兩個參數(對象s,DoWorkEventArgs參數)?

_worker.DoWork += delegate(object s, DoWorkEventArgs args) 
{ 
    BackgroundWorker worker = s as BackgroundWorker; 
    for (int i = 0; i < 10; i++) 
    { 
     if (worker.CancellationPending) 
     { 
      args.Cancel = true; 
      return; 
     } 

     Thread.Sleep(1000); 
     worker.ReportProgress(i + 1); 
    } 
}; 
+0

Lambdas應該用作表達式,co它編譯成表達式樹,在那裏我看不到使用lambda的好處。你爲什麼不把它作爲匿名方法? – nothrow 2009-07-30 09:45:00

+0

我不一定同意Yossarian。我認爲lambdas應該用於表達式,因爲它們使代碼更具可讀性。但對於我的錢來說,需要大括號的lambda不會使代碼更具可讀性,而且我會說這是一種代碼味道。 – Benjol 2009-07-30 09:55:39

+0

Banjol,所以你同意我:)(說清楚:這是imo濫用lambdas) – nothrow 2009-07-30 10:13:12

回答

1

形式的輪廓

_worker.DoWork += (s, args) => {body of method}; 

其他標點符號編譯器建議

1
_worker.DoWork += (s, args) => { 
    .... 
}; 

或者,如果編譯器無法找出確切類型的S和args:

_worker.DoWork += (object s, DoWorkEventArgs args) => { 
    .... 
};