C# 这个LINQ表达式是如何工作的?

C# 这个LINQ表达式是如何工作的?,c#,.net,linq,linq-to-sql,C#,.net,Linq,Linq To Sql,我知道这段代码在做什么,但我不确定语法。它似乎不符合“标准”格式。主要是林克吗 return db.Subjects.SingleOrDefault(s => s.ID == ID); 第一部分有道理,但括号里的部分我不明白。我们如何在不声明的情况下使用s?我们如何将逻辑放入方法调用中?它被称为Lambda表达式。请看这里的解释。 这是C#3.0编译器为您带来的魔力 该语句被编译为委托,相当于: return db.Subjects.SingleOrDefault(delegate(s)

我知道这段代码在做什么,但我不确定语法。它似乎不符合“标准”格式。主要是林克吗

return db.Subjects.SingleOrDefault(s => s.ID == ID);

第一部分有道理,但括号里的部分我不明白。我们如何在不声明的情况下使用
s
?我们如何将逻辑放入方法调用中?

它被称为Lambda表达式。请看这里的解释。

这是C#3.0编译器为您带来的魔力

该语句被编译为委托,相当于:

return db.Subjects.SingleOrDefault(delegate(s) { return s.ID == ID }); 
它被称为lambda表达式,因为您不需要正式声明参数,它们由C#编译器推断

第一部分有道理,但括号里的部分我不明白

你在这里看到的是一张照片。这是一个非常特殊的匿名代表

主要是林克吗

return db.Subjects.SingleOrDefault(s => s.ID == ID);
是一种LINQ方法,但lambda是独立于LINQ的;他们只是让林克比其他人更加友好

现在,为了获得特定的
IEnumerable.SingleOrDefault(s=>s.ID==ID)
返回
IEnumerable
中与谓词
s=>s.ID==ID
匹配的
Subject
的唯一实例,如果没有这样的实例,则返回
null
。如果有多个这样的实例,它将抛出一个异常。在编译时,
s=>s.ID==ID
被转换为一个完整的委托,该委托吃掉
Subject
类型的对象,并返回一个
bool
,即
true
当且仅当
s.ID
等于
ID时

我们如何在不声明的情况下使用
s

=>
是最简单的代码。它基本上将lambda表达式的左侧与右侧分开。左侧是输入变量。它相当于显式定义的方法中的参数列表。也就是说,lambda表达式中的
s
在下面扮演
s
的角色:

public bool Predicate(Subject s)
只是您不必声明
s
的类型,因为编译器会推断它

右侧是lambda车身。它相当于下面的身体

public bool Predicate(Subject s) {
    return s.ID == ID;
}
而且,您不必声明返回类型;编译器将推断为

所以,最后你好像做了以下几件事:

class MyPredicate {
    public string ID;
    public bool Predicate(Subject s) {
        return s.ID == this.ID;
    }
}
然后:

//元素是IEnumerable
//ID是字符串
MyPredicate谓词=新的MyPredicate();
predicate.ID=ID;
elements.SingleOrDefault(predicate.predicate);

很好的一点是,当您使用lambda表达式时,编译器会自动为您吐出这个值。

这是一个。

我认为您的困惑在于表达式
s=>s.ID==ID
。这是一个lambda表达式。这是一种定义内联函数的简单方法


在这种情况下,
=>
左侧的文本是参数列表。因此,s是通过处于它的位置来声明的。
=>
的右侧是执行的表达式。在此特定上下文中,lambda将在集合中的每个元素上运行,代码将断言有一个值符合lambda执行的表达式。

s before=>声明一个结构元素类型的变量(Subjects变量EDIT中包含的类型:其他函数与更多参数一起工作,例如Join)位于右部分(after=>)。逻辑来自函数。如果调用SingleOrDefault(在文档中查找),如果满足条件或为NULL,它将返回单个元素。LINQ中有许多函数可以使用(例如First(),Where(),…)。希望能有所帮助。

谢谢你的精彩解释。回答得好!真是太棒了+1@Jason:很好地解释了lambda表达式。不知道您是否可以将其作为像我这样的初学者的单独问答发布;)