c# - 将列表中的项目分配给列表中的另一个项目的最快方法

标签 c# performance linq list

我有两个类,product 和 order,请看类属性blow

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 中进行了不必要的查找,因为一些订单数据已经分配。

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

最佳答案

It's because we are doing unnecessary lookup in orderList

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

因此您需要一个快速的替代方案,而最简单的标准(也是非常有效的基于哈希的实现)是构建和使用Order lookup通过 ProductId 使用 ToLookup方法,它将时间复杂度调整为 O(N + M):

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

关于c# - 将列表中的项目分配给列表中的另一个项目的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43137306/

相关文章:

Jquery fadeIn 和 fadeOut 页面在加载之间生成白色页面闪烁

mysql - 如何使用 MySQL(如 SqlBulkCopy)和 Linq to Entities 进行批量插入

c# - LINQ 检查 FirstOrDefault 是否为 null 并使用它

c# - 如何在单元测试中等待后使用断点?

c# - Unity中的简单事件系统

c# - 使用c#从文本中提取所有电子邮件地址

php - 如何调试 AWS Elastic Beanstalk 中的性能问题

python - 与 einsums 的交叉产品

c# - 从 C# 中以编程方式创建的 TextBox 中获取值

c# - LINQ .FromSQL 错误 InvalidOperationException : Sequence contains more than one matching element