我有這行代碼,它的工作原理,但我不明白:瞭解代表和代表語法
Genres.Find(delegate (Genre genre) { return genre.Id == id; });
流派是流派的列表(音樂)
正是這裏發生了什麼?
我有這行代碼,它的工作原理,但我不明白:瞭解代表和代表語法
Genres.Find(delegate (Genre genre) { return genre.Id == id; });
流派是流派的列表(音樂)
正是這裏發生了什麼?
它說的形式參數,找到類型(從列表中Genres
),具有標識等於該值從變量id
。
關鍵字delegate
說,這是一種內聯函數的這決定檢查是否對每個項目或不正確的。一開始(Genre genre)
說「給我所說的每個元素genre
在循環中,我可以檢查每個項目標識其命名變量Id
」。這是:genre.Id == id
。
現代的做法是lambda表達式,如用法:
var x = Genres.Find(g => g.Id == id);
在這種情況下g
是你的循環變量,你可以覈對。
C#提供了兩種定義委託的方法,無需爲其編寫命名方法--C#2.0中引入的舊的anonymous method語法,以及C#3.0中引入的較短的lambda語法。
你的代碼是寫這個老辦法:
Genres.Find(genre => genre.Id == id);
這article介紹的匿名函數在C#中的演變。
您的Find
方法需要謂詞委託。根據您的代碼所針對的.NET版本,它可能是也可能不是System.Predicate<T>
委託,但其功能是等同的。圓括號中的匿名方法提供了謂詞的實現,允許您將任意條件傳遞給Find(...)
方法。
也許我這裏不使用正確的術語。但是形成一個抽象的觀點:這裏的Find方法接受一個委託作爲參數。它允許你實現「查找」算法(在這裏比較id)。它是靈活的代碼,你也可以比較任何其他「流派」的對象。
一個直觀的方法看到它:
Genres.Find( --- The CompareGenres function is being called from here --- );
bool CompareGenres(Genre genre)
{
return genre.Id == id;
}
查找接受謂詞< T>,T是參數的類型,在這種情況下:你傳遞這是供應類型的實例通過Find方法。
「謂詞爲代表到,如果傳遞給它的對象匹配在委託中定義的條件,則返回true的方法。」
所以你只是路過的方法,如委託
這是什麼問題? – Backs
它是如何工作的! –
你知道lamda表達..嗎? – Jonesopolis