foreach替代加速方法

时间:2018-03-26 17:27:39

标签: c# linq

我正在逐步完成此代码,这种方法需要一段时间才能遍历20K产品。 是否有替代foreach循环来加快速度?这可以用Linq完成吗?

public IEnumerable<IProduct> ReturnOnlyRequestedSkus(IEnumerable<IProduct> products, IEnumerable<string> requestedSkus)
{
    var productList = new List<IProduct>();

    var allowedProducts = from sku in requestedSkus
                          join product in products
                          on sku.ToUpper() equals product.Sku.ToUpper()
                          select product;

    foreach (var product in allowedProducts)
    {
        if (product.ItemType.Equals("Kit", StringComparison.OrdinalIgnoreCase) 
                 && product.KitIncludes != null)
        {
            var skusInKit = product.KitIncludes.Select(x => x.Sku);
            var skusInProducts = products.Select(x => x.Sku);

            if (skusInProducts.ContainsAll(skusInKit))
            {
                productList.Add(product);
            }

        }
    }

    return productList;
}

1 个答案:

答案 0 :(得分:-1)

假设您实际上是在尝试查询数据库(您没有说,但大多数处理20K +产品的应用程序往往不会将它们保留在内存中),请改用IQueryable并将其转换为一个大数据库LINQ表达式并将其传递给数据库以进行评估,而不是将其全部读入内存以进行客户端查询和列表构建。

public IQueryable<IProduct> ReturnOnlyRequestedSkus(IQueryable<IProduct> 
products, IEnumerable<string> requestedSkus)
{
  return products
    .Where(p => requestedSkus.Any(sku => String.Equals(p.Sku, sku, StringComparison.OrdinalIgnoreCase &&
       p.ItemType.Equals("Kit", StringComparison.OrdinalIgnoreCase) && 
       p.KitIncludes != null &&
       ...
       ;
}

那样的方式(i)你穿过电线越来越少; (ii)数据库本身可以优化查询; (iii)您的搜索结果会被延迟评估,以便有人对其进行.First()调用,或.Count()它无法全部获取。

但最后一部分检查的是什么?套件中的所有零件都是产品本身?您是否应该使用约束在数据库级别确保某些内容?