Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c#中,的意思是=>;签名_C#_Lambda - Fatal编程技术网

在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 body
i.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)
    做什么
情况是这样的。您有一个学生对象列表和您感兴趣的学生id。如果学生对象存储在您自己定义的集合中,该集合具有接受id并返回具有该id的学生的Find方法,则您的代码如下所示:

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)