列出Lambda表达式

时间:2016-06-29 17:58:43

标签: c# lambda

我有这样的课程:

main()

var myData = CustomerObj.orders.Select(x => new MyOrderInfo(x)); 我有以下代码:

myData

任何人都可以帮我理解上述内容吗?当我调试并观察get { return _order.ShiptoAddress[xxx].Value; } 的值时,令我惊讶的是它有#34;地址1"设置为xxxx值。它是如何工作的?我在MyOderInfo类中有几个其他属性

{{1}}

并且所有这些都有适当的价值......在哪里设定?这段代码是如何工作的?

2 个答案:

答案 0 :(得分:1)

查看Select的签名:

public static IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, TResult> selector
)

你的linq查询(包括编译器推断的泛型参数)是:

orders.Select<Order, MyOrderInfo>(x => new MyOrderInfo(x));

因此,从论据中,它采用IEnumerable<Order>并返回IEnumerable<MyOrderInfo>。您传入Func的{​​{1}}应该是这样做的:

Select

这只是一种匿名方法,是您编写的方法的简写。写出的完整方法可以在这里替换:

x => new MyOrderInfo(x)

public MyOrderInfo GetOrderInfo(Order x) { return new MyOrderInfo(x); } 有一个带MyOrderInfo的构造函数,所以编译都很好。

Order有一个getter,所以你可以把它想象成一个方法(它确实是这样)。每当您访问Address1时,它都会为您提供Address1_order.ShiptoAddress[0].Value;已在构造函数中实例化,因此只要其_order中至少有一个项目,它就可以正常工作。

答案 1 :(得分:0)

Linq查询调试很棘手。实际上,他们创建的是围绕原始数据的一组“包装器”,因此仅通过在调试器中挖掘实际结果是不明显的。

查看结果的最佳方法是实现查询。最简单的方法是调用ToArrayToList并将查询水合成具体的数据结构。您可以在程序本身或监视/即时窗口中执行此操作,但需要注意的是,每次调用ToList都会创建结果,因此您可以多次迭代源数据,这可能是个问题。