我知道这段代码在做什么,但我不确定语法.它似乎不符合"标准"格式.它主要是LINQ吗?
return db.Subjects.SingleOrDefault(s => s.ID == ID);
Run Code Online (Sandbox Code Playgroud)
第一部分是有道理的,但它是我不理解的括号中的部分.我们如何在s不声明的情况下使用?我们如何将逻辑放入方法调用中?
jas*_*son 16
第一部分是有道理的,但它是我不理解的括号中的部分.
你在这里看到的是一个lambda表达式.这是一个非常特殊的匿名代表.
它主要是LINQ吗?
Enumerable.SingleOrDefault是一个LINQ方法,但lambdas是独立于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运算符.它基本上将lambda表达式的左侧与右侧分开.左侧是输入变量.它等同于显式定义方法中的参数列表.那是s在lambda表达式中起到以下作用s:
public bool Predicate(Subject s)
Run Code Online (Sandbox Code Playgroud)
只是你不必声明s编译器会推断它的类型.
右边是lambda身体.它相当于下面的身体
public bool Predicate(Subject s) {
return s.ID == ID;
}
Run Code Online (Sandbox Code Playgroud)
更重要的是,您不必声明返回类型; 编译器会推断出来.
所以,最后它就好像你做了以下事情:
class MyPredicate {
public string ID;
public bool Predicate(Subject s) {
return s.ID == this.ID;
}
}
Run Code Online (Sandbox Code Playgroud)
然后:
// elements is IEnumerable<Subject>
// ID is string
MyPredicate predicate = new MyPredicate();
predicate.ID = ID;
elements.SingleOrDefault(predicate.Predicate);
Run Code Online (Sandbox Code Playgroud)
好的一点是编译器在你使用lambda表达式时会自动为你调出这个.
这是C#3.0编译器为你工作的一些魔力.
该语句被编译成一个委托,相当于:
return db.Subjects.SingleOrDefault(delegate(s) { return s.ID == ID });
Run Code Online (Sandbox Code Playgroud)
它被称为lambda表达式,因为您不需要正式声明参数,它们是由C#编译器推断的.
| 归档时间: |
|
| 查看次数: |
987 次 |
| 最近记录: |