在c#中,的意思是=>;签名
有一个名为在c#中,的意思是=>;签名,c#,lambda,C#,Lambda,有一个名为Student的类,其属性为Id、Name和Phone。 在UI表单中,有一个学生的列表,其方式如下: List<Student> students=new List<Student>(); students.Find(i=>i.Id==Id)做什么?这是什么意思?=>符号的含义是什么?它是如何工作的 这是一个转到运算符(or)的,用于(匿名方法创建)将输入变量与lambda体分离 在示例中,Find(i=>i.Id==Id)输入变量i转到lambda bod
Student
的类,其属性为Id
、Name
和Phone
。
在UI表单中,有一个学生的列表,其方式如下:
List<Student> students=new List<Student>();
students.Find(i=>i.Id==Id)
做什么?这是什么意思?=>
符号的含义是什么?它是如何工作的 这是一个转到
运算符(or)的,用于(匿名方法创建)将输入变量与lambda体分离
在示例中,Find(i=>i.Id==Id)
输入变量i
转到lambda bodyi.Id==Id
(即作为匿名方法参数传递)
还可以看看您正在使用的方法。它接受类型为
T
,在您的情况下,它将是谓词
。谓词是一个委托,它表示定义一组条件并确定指定对象是否满足这些条件的方法。其签名如下:
public delegate bool Predicate<in Student>(Student obj)
bool MyFindMethod(Student param)
并以这种方式使用它:
Student aStudent = students.Find(IsStudentHasIdEqualTo5);
但您需要验证不同的id值。有两个选项-要么在类中创建字段,该字段将在学生谓词方法中可用,要么创建类,该类将同时包含此方法和字段:
class StudentSearcher
{
private int _id; // capture id
public StudentSearcher(int id)
{
_id = id;
}
// method has same signature as bool Predicate(Student obj)
public bool VerfyId(Student s)
{
return s.Id == _id;
}
}
现在,您可以使用此命名方法并为学生验证提供不同的id
值:
var searcher = new StudentSearcher(id);
Student aStudent = students.Find(searcher.VerfyId);
但是为每次搜索创建这样的方法和类并不是很有效。这就是为什么我们有代理(和lambda)。不必声明新的命名方法,您可以在需要的地方创建不带名称(匿名)的方法,编译器将为您生成常用的命名方法:
Student aStudent = students.Find(delegate(Student s) {
return s.Id == id;
});
可以用lambda语法编写完全相同的代码(省略委托关键字,推断参数类型,转到用于分隔参数和方法体的
运算符,也省略返回关键字):
这里的神奇之处在于,编译器将生成类似于上图幕后所示的类。该类将具有带有谓词签名的方法,并且它还将具有用于捕获要搜索的
id
的字段。它们被称为Lambda表达式…Lambda表达式使用特殊语法。它们允许函数用作变量或字段等数据。lambda表达式语法使用=>运算符。这将分离匿名函数的参数和语句体
你可以把它称为“去”
=>运算符可以读作“goes to”,并且在声明lambda表达式时始终使用它。lambda表达式允许您将带有可执行语句的函数用作参数、变量或字段
请参见MSDN以更好地理解它。=>是一个goesto运算符,此表达式是lambda expression
请参见lambda运算符将函数参数与其主体分离
(arg1,arg2...argn)
=>
{
//body
}
正文也可以不带括号。。但它仍然是一个“身体”
Find是采用lambda表达式的Linq方法
它将贯穿学生的每个元素
元素由i
表示-尽管student
更合理-并被传递到“body”中。
如果i.Id==Id
Find方法返回student
元素。
做什么李>students.Find(i=>i.Id==Id)
Student aStudent = students.Find(id);
students.Find(MyFindMethod)
然而,当微软定义通用列表集合时,他们不可能知道它将如何使用——他们也不想知道。他们想让你有机会将其用于学生对象或任何其他你能想到的类型。但这意味着他们必须给你一种方法,通过提供只有你知道的关于你的问题的信息来找到你想要的元素。在这个特定的实例中,您知道您正在查找存储在学生列表中的学生对象,该对象的Id字段与您的Id匹配。如果我给了您一个对象,让我们称之为I
,您可以通过执行以下检查来告诉我它是否是您要查找的对象:
i.Id == id
如果我给你一个名为student
的对象,你可以执行测试student
你可以通过执行测试来告诉我它是否是你要找的对象
student.Id==Id
(如果您没有id,但有一些唯一确定学生对象(即密钥)的其他信息,则需要指定不同的条件。灵活性很重要!)
那么,现在我们进入下一个问题
- 这是什么意思
让我们创建一个约定。您将确定要调用的student对象,并提供一个适当的检查来选择您要查找的学生。您将表示该学生的标识符放在
的左侧,检查条件放在右侧。因此,您可以有如下内容: student=>student.Id==Id=>
i
,而不是student
,那么您可以编写
i=>i.Id==Id
现在看一看。这是什么?给定一个Student对象返回bool。这是一个函数
- =>符号的含义是什么 它是定义函数的运算符。论点在左手边,主体在右手边
- 它是如何工作的
假设您想让我编写一个函数,它接受一个列表参数和一个函数,比如我们正在讨论的函数,并返回匹配的s
Student aStudent = students.Find(id);
i.Id == id
bool Predicate(T param)
bool MyFindMethod(Student param)
bool MyFindMethod(Student param) { // Logic goes here }
students.Find(MyFindMethod)
s => s.Id == id
bool AnonymousMethod(Student param) { return s.Id == id; }
public class Customer { public string Name { get; set;} } public IList<Customer> customers = new List<Customer>();
customers.Find(c => c.Name == name);
students.Find(i => i.Id == id)