将项目从列表分配到列表中的另一个项目的最快方法

时间:2017-03-31 09:33:21

标签: c# performance linq list

我有两个类是产品和订单,请看一下类属性打击

public class Product()
{ 
  public int ProductId { get;set; }
  public string ProductName { get;set; }
  public List<Order> OrderList { get;set; }
}

public class Order()
{
  public int OrderId { get;set; }
  public int ProductId { get;set; }
  public string OrderNumber { get;set; }
  public string OrderDescription { get;set; }
}

我有一个单独的调用来从每个类

获取数据
var productList = ProductService.GetAllProductList();
var orderList = OrderService.GetAllOrderList();

我想在这里实现的是,我想将订单列表对象分配给产品,我可以通过以下方式实现此目的

  foreach(var product in productList)
  {
     var selectedOrderList = orderList.Where(x => x.ProductId = product.ProductId).ToList();
     product.OrderList = selectedOrderList;
  }

成像如果我的产品和订单包含大量数据,则可能会导致一些性能问题。

这是因为我们在orderList中进行了不必要的查找,因为已经分配了一些订单数据。

有没有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:3)

  

这是因为我们在orderList中进行了不必要的查找

我不会把它称为不必要的,但由于LINQ to Objects Where方法的线性时间复杂性,肯定它效率低,导致O (N * M)处理算法的复杂性。

所以你需要一个快速的替代方案,最简单的标准(以及非常有效的基于哈希的实现)是使用lookupOrder之前构建和使用ProductId s ToLookup方法,将时间复杂度调整为O(N + M):

var ordersByProductId = orderList.ToLookup(order => order.ProductId);
foreach (var product in productList)
     product.OrderList = ordersByProductId[product.ProductId].ToList();

答案 1 :(得分:0)

如果您已经在orderList中返回服务中所有订单的列表...那么从内存列表中执行linq WHERE不应该有任何性能问题。

或者您更改服务以在返回之前填充product.OrderList。