我知道这段代码在做什么,但我不确定语法。它似乎不符合“标准”格式。它主要是LINQ吗?
return db.Subjects.SingleOrDefault(s => s.ID == ID);
第一部分是有道理的,但它是括号中我不明白的部分。我们如何在不声明的情况下使用s
?我们如何将逻辑放入方法调用中?
答案 0 :(得分:16)
第一部分是有道理的,但它是括号中我不明白的部分。
你在这里看到的是lambda expression。这是一个非常特殊的匿名代表。
主要是LINQ吗?
Enumerable.SingleOrDefault
是一个LINQ方法,但lambda是独立于LINQ的东西;他们只是让LINQ变得非常友好,否则就会如此。
现在,要获取特定IEnumerable<Subject>.SingleOrDefault(s => s.ID == ID)
,请在Subject
中返回与谓词IEnumerable<Subject>
匹配的唯一s => s.ID == ID
实例,否则返回null
没有这样的例子。如果存在多个此类实例,则会引发异常。在编译时,s => s.ID == ID
被翻译成一个完整的委托,吃掉Subject
类型的对象,并返回bool
true
当且仅当s.ID
}等于ID
。
我们如何在不声明的情况下使用
s
?
=>
是lambda operator。它基本上将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;
}
}
然后:
// elements is IEnumerable<Subject>
// ID is string
MyPredicate predicate = new MyPredicate();
predicate.ID = ID;
elements.SingleOrDefault(predicate.Predicate);
好处是编译器在你使用lambda表达式时会自动为你吐出来。
答案 1 :(得分:5)
它被称为Lambda Expression。请看这里的解释。 Lambda Expressions (C# Programming Guide)
答案 2 :(得分:5)
这是C#3.0编译器为你工作的一些魔力。
该语句被编译成一个委托,相当于:
return db.Subjects.SingleOrDefault(delegate(s) { return s.ID == ID });
它被称为lambda表达式,因为您不需要正式声明参数,它们是由C#编译器推断的。
答案 3 :(得分:4)
我认为你的困惑在于s => s.ID== ID
这个词。这是一个lambda表达式。简单来说,这是一种定义内联函数的方法。
在这种情况下,=>
左侧的文本是参数列表。因此,s凭借其在其中的位置而被宣布。 =>
的右侧是执行的表达式。在这个特定的上下文中,lambda将在集合中的每个元素上运行,代码将声明有一个值满足lambda执行的表达式。
答案 4 :(得分:0)
答案 5 :(得分:0)
s before =&gt;声明一个变量,其结构元素的类型(Subjects变量中包含的类型编辑:其他函数适用于更多参数,即。Join ),它位于右侧部分(在=>&gt;之后)。逻辑来自功能。如果调用SingleOrDefault(在docs中查找),如果满足条件或NULL,它将返回SINGLE元素。 LINQ中有许多函数可以使用(即First(),Where(),...)。希望有所帮助。