这是使用northwind数据库的书中的一个例子。什么是=>意思 ?
Northwind db = new Northwind(@"Data Source=.\SQLEXPRESS;InitialCatalog=Northwind");
var orders = db.Customers
.Where(c => c.Country == "USA" && c.Region == "WA")
.SelectMany(c => c.Orders);
Console.WriteLine(orders.GetType());
为什么他们不写
Where(c.Country == "USA" && c.Regian == "WA")
答案 0 :(得分:3)
Where()
括号内的部分需要是函数,它取Customer
并返回bool
ean值(即{{1}在C#的类型系统中)。
使用C#的Lambda Expressions来编写该函数是最常见的。
Func<Customer, bool>
部分表示“将传递给您的c =>
称为Customer
。然后使用c
的值,计算此条件。 c
左侧的c
,编译器无法知道=>
指的是什么。
答案 1 :(得分:1)
这是一个lambda表达式。它描述了功能;箭头左侧的变量是函数的参数。在这种情况下,函数有一个参数,因此箭头左侧有一个变量。
考虑一下你给出的“他们为什么不......”的例子。 c
在哪里宣布?编译器如何知道它代表什么?
您可能想知道编译器如何知道c
参数的类型,它显然会这样做,因为它允许您调用Country
和Region
属性。这是通过类型推断完成的。 Where
方法需要一个带有参数的委托参数,该参数的类型取决于序列的类型(在这种情况下为Customers
)。
由于Customers
是IEnumerable<Customer>
,编译器需要一个具有单个Customer
参数的委托,因此它将lambda表达式的单个参数视为Customer
变量
答案 2 :(得分:1)
如果他们写了这个:
Where(c.Country == "USA" && c.Regian == "WA")
您在哪里定义变量c
所指的内容?如果在我的代码中早些时候我写过的话会怎么样:
var c = "this is a string";
这个表示法定义了一个lambda结构,其中c =>
绑定到Where
函数所期望的委托输入 - 在这种情况下,c
绑定到每一行,并且函数你运行c
需要返回一个布尔值。
请注意,您可以编写如下函数:
public bool OnlyWA(Row c)
{
return c.Country == "USA" && c.Regian == "WA";
}
然后像这样使用它:
var orders = db.Customers
.Where(OnlyWA)
.SelectMany(c => c.Orders);
此处您不再需要c
,因为您使用的是命名函数而不是lambda变量。该函数的唯一参数代替c
。这对于小函数来说通常是过度的,并且随着小谓词函数从其使用(以及因此上下文)位置移开而进一步使其更难阅读。
答案 3 :(得分:0)
=&GT;是lambda运算符 见这里:msdn
它在lambda表达式中用于将左侧的输入变量与右侧的lambda体分开。 Lambda表达式是类似于匿名方法的内联表达式,但更灵活;它们广泛用于以方法语法表示的LINQ查询中。