2011-12-15 89 views
2

我有一個客戶端類型的IList。我需要遍歷它並返回一個匹配某個條件的元素。我想用比的foreach所以我想一個方法「更聰明」的方式,但我不知道爲什麼這個作品,如果它可以做不同的方式(我不是高級):在Ilist中使用Func,爲什麼是lambda表達式?

private client GetClientByID(short ID) 
{ 
    return this.ListOfClient.Single(c => c.ID == ID); 
} 

我不瞭解lambda表達式的使用..我嘗試了一種匿名方法,但無法正確編寫它。 謝謝

+0

`Single`是使用`foreach`實現的。注意`Single`會遍歷整個列表並且拋出一個異常,如果沒有一個`Client`符合條件。您可能需要使用「First」或「FirstOrDefault」。 – 2011-12-15 11:07:47

回答

1

你的代碼是正確的,這個lambda表達式基本上是一個返回bool的方法(在這個特定情況下) 。所以想象一下,對於ListOfClient中的每個項目,它都會嘗試執行該方法,如果它返回true,那麼它將返回該項目。

你需要小心,通過使用Single,如果列表中有0個或多個匹配項,它將失敗。

如果你確信將只有1項,然後它是好的,如果不是你可以使用下列之一:

  • List.SingleOrDefault() //returns null if there are 0 items, fails if there are more than 1
  • List.First() //fails if there are 0 items
  • List.FirstOrDefault() //never fails, returns null if there are 0 items
+0

謝謝,有沒有方法如何寫沒有蘭巴?由於他們有更多的意義,我對蘭巴表達很困惑。並且幫助中說有Func <> expected – 2011-12-15 11:09:29

0

來自MSDN

lambda表達式是一個匿名函數,可以包含表達式和語句,並可用於創建委託或表達式樹類型。

這意味着你的代碼就相當於

private client GetClientByID(short ID) 
{ 
    return this.ListOfClient.Single(delegate(Client c) { return c.ID == ID; }); 
} 

單是可以被確定爲Enumerable.Single Method (IEnumerable, Func) 注重在第二個參數

Func<TSource, bool> predicate 

another article of MSDN

一個LINQ擴展方法

謂詞代表。表示定義一組標準並確定指定對象是否滿足標準的方法。

這意味着它將檢查集合的每個元素的標準return c.ID == ID;並返回迴應要求的元素。

PS請注意Single方法。根據任務的不同,我更願意使用SingleOrDefaultFirstOrDefault

相關問題