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

C#指向新匿名类型的lambda是什么意思?,c#,C#,我过去曾在LINQ中使用lambdas并生成匿名函数,但下面这一行让我感到困惑 (a,b) => new {a, b.PropertyA, b.PropertyB, b.PropertyC } 这是怎么回事?看起来匿名方法指向的是匿名类型。这将作为“resultSelector”参数传递给联接方法 指定的代码表示一个包含两个参数的函数,调用时将创建一个具有指定属性的新匿名类型 那么这个, (a,b)表示参数 这是: new {a, b.PropertyA, b.PropertyB, b

我过去曾在LINQ中使用lambdas并生成匿名函数,但下面这一行让我感到困惑

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

这是怎么回事?看起来匿名方法指向的是匿名类型。这将作为“resultSelector”参数传递给联接方法

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

那么这个,

(a,b)
表示参数

这是:

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

是要执行的代码。

让我们在更大的上下文中查看它。我们有一个客户表和一个订单表,每个客户都有一个整数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};} );
IEnumerable结果=
可枚举.连接(
客户,
命令,
(客户)=>{return Customer.Id;},
(订单)=>{return Order.CustomerId;},
(客户,订单)=>{返回新的{客户,订单.金额};});
Join
将枚举所有客户和所有订单,根据前两个lambda获取其ID,并在ID匹配的位置构建(客户、订单)对集合。然后,它将遍历对的集合,并将它们传递给第三个lambda,以生成匿名类型的对象序列

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


练习:假设
订单。CustomerId
的类型为
int?
,而不是
int
。这应该是一个错误吗?或者C#应该认为如果
Customer.Id
int
并且
Order.CustomerId
int?
,那么用户的意思可能是“将
int
视为
int?
”?假设您执行了一个连接,其中连接键的类型为
Giraffe
Turtle
。类型推断应该假定您指的是
动物
,还是应该给出一个错误,说明不清楚是哪种类型?这是我们在C#3中设计和实现类型推断时思考的许多微妙问题之一,而当我在C#4中添加泛型方差时,这一问题变得更加困难!看看你是否能解决这个问题。

你的问题已经有了自己的答案。这是一个匿名方法,它返回一个匿名类型,它不指向它,而是返回它。想象一下
new
前面的“return”这个词,它会把事情弄清楚。非常感谢。至于演习。。。我要胡乱猜一猜。在第一个例子中,我认为C#会像SQL在使用空值连接列时那样处理它。在第二种情况下,可能会在动物身上使用“相等”的方法(前提是海龟或长颈鹿没有覆盖它)?看起来我应该在周末花些时间玩/做实验。@Dave:如果你对这个主题感兴趣的话——关于复杂方法(如Join)的泛型类型推断——那么多年来,我已经在我最初的msdn博客和ericlippert.com上写了很多关于它的文章。