0

这是使用北风数据库的书中的示例。=> 是什么意思?

   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")
4

4 回答 4

3

括号内的部分Where()需要是一个接受 a并返回ean 值的函数(C# 的类型系统中)。CustomerboolFunc<Customer, bool>

使用 C# 的Lambda 表达式编写该函数是最常见的。

c =>部分的意思是“获取Customer传递给您的内容并调用它c。然后使用 的值c,计算这个条件。如果没有c左侧的=>,编译器将无法知道c指的是什么。

于 2012-05-14T00:34:21.283 回答
1

这是一个 lambda 表达式。它描述了一个函数;箭头左侧的变量是函数的参数。在这种情况下,函数只有一个参数,因此箭头左侧只有一个变量。

考虑一下您给出的“他们为什么不...”示例。在哪里c声明?编译器如何知道它代表什么?

您可能想知道编译器如何知道c参数的类型,它显然知道,因为它允许您调用CountryandRegion属性。这是通过类型推断完成的。该Where方法需要一个带参数的委托参数,该参数的类型取决于序列的类型(Customers在这种情况下)。

由于Customersis IEnumerable<Customer>,编译器需要一个带有单个Customer参数的委托,因此它将 lambda 表达式的单个参数视为一个Customer变量。

于 2012-05-14T00:34:31.400 回答
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. 这对于小型函数来说通常是多余的,并且随着小型谓词函数从其使用(以及因此上下文)位置移开,进一步使其更难阅读。

于 2012-05-14T00:35:01.583 回答
0

=> 是 lambda 运算符请参见此处:msdn

它在 lambda 表达式中用于将左侧的输入变量与右侧的 lambda 主体分开。Lambda 表达式是类似于匿名方法但更灵活的内联表达式;它们广泛用于以方法语法表示的 LINQ 查询。

于 2012-05-14T00:35:26.017 回答