我有两个类是产品和订单,请看一下类属性打击
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中进行了不必要的查找,因为已经分配了一些订单数据。
有没有更好的方法来实现这一目标?
答案 0 :(得分:3)
这是因为我们在orderList中进行了不必要的查找
我不会把它称为不必要的,但由于LINQ to Objects Where
方法的线性时间复杂性,肯定它效率低,导致O (N * M)处理算法的复杂性。
所以你需要一个快速的替代方案,最简单的标准(以及非常有效的基于哈希的实现)是使用lookup在Order
之前构建和使用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。