2015-09-10 29 views
0

我有這行代碼,它的工作原理,但我不明白:瞭解代表和代表語法

Genres.Find(delegate (Genre genre) { return genre.Id == id; }); 

流派是流派的列表(音樂)

正是這裏發生了什麼?

+1

這是什麼問題? – Backs

+0

它是如何工作的! –

+0

你知道lamda表達..嗎? – Jonesopolis

回答

1

它說的形式參數,找到類型(從列表中Genres),具有標識等於該值從變量id

關鍵字delegate說,這是一種內聯函數的這決定檢查是否對每個項目或不正確的。一開始(Genre genre)說「給我所說的每個元素genre在循環中,我可以檢查每個項目標識其命名變量Id」。這是:genre.Id == id

現代的做法是lambda表達式,如用法:

var x = Genres.Find(g => g.Id == id); 

在這種情況下g是你的循環變量,你可以覈對。

3

C#提供了兩種定義委託的方法,無需爲其編寫命名方法--C#2.0中引入的舊的anonymous method語法,以及C#3.0中引入的較短的lambda語法。

你的代碼是寫這個老辦法:

Genres.Find(genre => genre.Id == id); 

article介紹的匿名函數在C#中的演變。

您的Find方法需要謂詞委託。根據您的代碼所針對的.NET版本,它可能是也可能不是System.Predicate<T>委託,但其功能是等同的。圓括號中的匿名方法提供了謂詞的實現,允許您將任意條件傳遞給Find(...)方法。

0

也許我這裏不使用正確的術語。但是形成一個抽象的觀點:這裏的Find方法接受一個委託作爲參數。它允許你實現「查找」算法(在這裏比較id)。它是靈活的代碼,你也可以比較任何其他「流派」的對象。

1

一個直觀的方法看到它:

Genres.Find( --- The CompareGenres function is being called from here --- ); 

bool CompareGenres(Genre genre) 
{ 
    return genre.Id == id; 
} 

查找接受謂詞< T>,T是參數的類型,在這種情況下:你傳遞這是供應類型的實例通過Find方法。

「謂詞爲代表到,如果傳遞給它的對象匹配在委託中定義的條件,則返回true的方法。」

所以你只是路過的方法,如委託