在c#中,意思是=>符号

Rhy*_*aon 7 c# lambda

有一个名为Student具有属性的类Id,NamePhone.在UI表单中,有一个Student以下列方式的列表:

List<Student> students=new List<Student>();
Run Code Online (Sandbox Code Playgroud)

最后有一个dataGridview_Cellclick事件代码,使用下面的代码:

string id = dataGridview.Rows[e.RownIndex].Cells[0].Value.ToString();  
Student aStudent = students.Find(i=> i.Id== id);
Run Code Online (Sandbox Code Playgroud)

怎么students.Find(i=> i.Id== id)办?这是什么意思?=>标志是什么意思?它是如何工作的?

Ser*_*kiy 3

这是一个goes to运算符(或lambda 运算符),用于lambda 表达式(匿名方法创建)以将输入变量与 lambda 主体分开。

在您的示例中,students.Find(i => i.Id== id)输入变量i转到 lambda 主体i.Id == id(即作为匿名方法参数传递)。


另请查看List<T>.Find您正在使用的方法。它接受类型的谓词T,在您的情况下将是Predicate<Student>。Predicated 是一个委托,它表示定义一组条件并确定指定对象是否满足这些条件的方法。它有以下签名:

public delegate bool Predicate<in Student>(Student obj)
Run Code Online (Sandbox Code Playgroud)

因此,您需要传递一个方法,该方法接受一个学生对象并返回一个布尔值。您可以为此创建正常的命名方法:

private bool IsStudentHasIdEqualTo5(Student s)
{
   return s.Id == 5;
}
Run Code Online (Sandbox Code Playgroud)

并以这种方式使用它:

Student aStudent = students.Find(IsStudentHasIdEqualTo5);
Run Code Online (Sandbox Code Playgroud)

但您需要验证不同的 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以使用此命名方法并id为学生验证提供不同的值:

var searcher = new StudentSearcher(id);
Student aStudent = students.Find(searcher.VerfyId);
Run Code Online (Sandbox Code Playgroud)

但是为每次搜索创建这样的方法和类并不是很有效。这就是我们有委托(和 lambda)的原因。您可以在需要的地方创建没有名称(匿名)的方法,而不是声明新的命名方法,编译器将为您生成常用的命名方法:

Student aStudent = students.Find(delegate(Student s) { 
                                      return s.Id == id; 
                                 });
Run Code Online (Sandbox Code Playgroud)

可以用 lambda 语法编写完全相同的代码(省略委托关键字,推断参数类型,goes to用于分隔参数和方法体的运算符,也省略返回关键字):

Student aStudent = students.Find(s => s.Id == id);
Run Code Online (Sandbox Code Playgroud)

这里的神奇之处在于,编译器将在幕后生成如上所示的类。该类将具有带有谓词签名的方法,并且还将具有用于捕获id和搜索的字段。