繁体   English   中英

C#指向新匿名类型的lambda是什么意思?

[英]C# What does a lambda that points to a new anonymous type mean?

过去,我在LINQ上使用过lambda,并制作了匿名函数,但以下几行让我感到困惑。

(a,b) => new {a, b.PropertyA, b.PropertyB, b.PropertyC } 

这里发生了什么? 似乎匿名方法指向匿名类型。 这作为“ resultSelector”参数传递给Join方法。

让我们从更大的角度来看它。 我们有一个客户表和一个订单表,其中每个客户都有一个整数ID,每个订单都有进行订单的客户的ID。 我们希望所有的客户拥有所有订单的金额:

var results = customers.Join(
  orders,
  customer => customer.Id,
  order => order.CustomerId,
  (customer, order) => new {customer, order.Amount});

编译器会将其转换为:

IEnumerable<SomeAnonType<Customer, decimal>> results = 
  Enumerable.Join<Customer, Order, int, SomeAnonType<Customer, decimal>>(
    customers,
    orders,
    (Customer customer) => { return customer.Id; },
    (Order order) => { return order.CustomerId; },
    (Customer customer, Order order) => { return new {customer, order.Amount};} );

Join将枚举所有客户和所有订单,并基于前两个lambda获取他们的ID,并建立ID匹配的(客户,订单)对的集合。 然后它将遍历对的集合,并将它们传递给第三个lambda以产生一系列匿名类型的对象。

现在清楚了吗? 还是您需要更多有关此处发生情况的解释?

练习 :假设Order.CustomerIdint?类型int? ,而不是int 那应该是一个错误吗? 还是C#应该判断出如果Customer.IdintOrder.CustomerIdint? 那么用户可能会说“将int当作int? ”? 假设您进行了GiraffeTurtle键的类型为GiraffeTurtle 类型推断应该假定您是Animal意思,还是应该给出一个错误信息,表明不清楚要使用哪种类型? 这是我们在C#3中设计和实现类型推断时所思考的许多微妙问题之一,而当我在C#4中添加泛型方差时,这个问题就变得更加棘手! 看看是否可以解决。

指定的代码表示一个带有两个参数的函数,并且在调用时将创建具有指定属性的新匿名类型。

所以这:

(a,b)代表参数。

和这个:

new {a, b.PropertyA, b.PropertyB, b.PropertyC } 

是要执行的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM