我有这样的课程:
main()
在var myData = CustomerObj.orders.Select(x => new MyOrderInfo(x));
我有以下代码:
myData
任何人都可以帮我理解上述内容吗?当我调试并观察get { return _order.ShiptoAddress[xxx].Value; }
的值时,令我惊讶的是它有#34;地址1"设置为xxxx值。它是如何工作的?我在MyOderInfo类中有几个其他属性
{{1}}
并且所有这些都有适当的价值......在哪里设定?这段代码是如何工作的?
答案 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查询调试很棘手。实际上,他们创建的是围绕原始数据的一组“包装器”,因此仅通过在调试器中挖掘实际结果是不明显的。
查看结果的最佳方法是实现查询。最简单的方法是调用ToArray
或ToList
并将查询水合成具体的数据结构。您可以在程序本身或监视/即时窗口中执行此操作,但需要注意的是,每次调用ToList
都会创建结果,因此您可以多次迭代源数据,这可能是个问题。