2015-09-10 32 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的方法。”

所以你只是路过的方法,如委托