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

Dav*_*ave 0 c#

我过去曾使用lambdas和LINQ并制作匿名函数,但下面这行让我感到困惑.

(a,b) => new {a, b.PropertyA, b.PropertyB, b.PropertyC } 
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?看起来匿名方法指向匿名类型.这将作为"resultSelector"参数传递给Join方法.

Eri*_*ert 6

让我们在更大的背景下看一下.我们有一个客户表和一个订单表,每个客户都有一个整数ID,每个订单都有订购客户的ID.我们希望所有客户都拥有所有订单的金额:

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

编译器会将其转换为:

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};} );
Run Code Online (Sandbox Code Playgroud)

Join将枚举所有客户和所有订单,根据前两个lambdas获取其ID,并构建一个(客户,订单)对的集合,其中ID匹配.然后它将迭代对的集合并将它们传递给第三个lambda以生成一系列匿名类型的对象.

那现在清楚了吗?或者你需要更多解释这里发生了什么?

练习:假设Order.CustomerId是类型int?,而不是int.这应该是错误吗?还是应该C#的数字,如果Customer.IdintOrder.CustomerIdint?那么很可能意味着用户"治疗intint?"?假设你做了一个连接,其中连接键是类型GiraffeTurtle.类型推断应该假设你的意思Animal,还是应该给出一个错误,说不清楚哪种类型是有意的?这是我们在C#3中设计和实现类型推断时考虑的许多微妙问题之一,当我在C#4中添加泛型方差时,它变得更难!看看你是否可以解决这个问题.