我有这行代码,它的工作原理,但我不明白:了解代表和代表语法
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