C# - 泛型List和ConvertAll()方法,它在内部如何工作?

时间:2010-05-09 21:51:30

标签: c# list generics convertall

从我在Sacha Barbers免费mvvm框架中发现的一些代码中我看到了这个:

return new DispatcherNotifiedObservableCollection<OrderModel>(
                    DataAccess.DataService.FetchAllOrders(
                        CurrentCustomer.CustomerId.DataValue).ConvertAll(
                            new Converter<Order, OrderModel>(
                                  OrderModel.OrderToOrderModel)));

FetchAllOrders为某个customerID返回List<Order>。 此列表将转换为List<OrderModel>或换句话说List<OrderViewModel>

怎么会发生这种情况?必须是什么要求/条件,List<Order>中Order对象的每个属性都转换为OrderModel的属性?

1 个答案:

答案 0 :(得分:2)

让我们让代码更具可读性:

List<Order> orders =
    DataAccess.DataService.FetchAllOrders(CurrentCustomer.CustomerId.DataValue);

Converter<Order, OrderModel> converter =
    new Converter<Order, OrderModel>(OrderModel.OrderToOrderModel);

List<OrderModel> orderModels = orders.ConvertAll(converter);

return new DispatcherNotifiedObservableCollection<OrderModel>(orderModels);

这里会发生什么?

  1. 代码从数据存储中提取所有订单并将其存储在List&lt; T&gt;中。

  2. 代码创建一个类型为Converter&lt; TInput,TOutput&gt;的委托。从单个Order转换为单个OrderModel。

  3. 该代码通过将转换器应用于每个订单,将所有订单转换为订单模型。

  4. 代码返回DispatcherNotifiedObservableCollection&lt; T&gt;转换后的值列表。

  5. 它是如何运作的?

    基本上,ConvertAll在这里做的是等同于:

    List<OrderModel> orderModels = new List<OrderModel>(orders.Count);
    for (int i = 0; i < orders.Count; i++)
    {
        orderModels[i] = OrderModel.OrderToOrderModel(orders[i]);
    }
    

    这会回答你的问题吗?