2012-03-22 42 views
1

我从我的数据库获取产品列表作为BindingList。我想使用用户已经选择的另一个项目列表来更新该列表中某些产品的数量。用于更新集合的嵌套循环的替代方法

这个想法是当用户从数据库中提出一个新的产品列表。该列表将显示已经从先前的搜索中选择的产品的数量。

我想出了下面的嵌套循环。它可以工作,但不能很好地扩展,因为数据库中的搜索可能会产生一个必须遍历的大列表。你们如何认为我可以改善这一点?

此外,我浏览了他们教Big-O符号的课程。以下解决方案的复杂性是什么?

谢谢。

for (int i = 0; i < dbProducts.Count; i++) 
{ 
    for (int j = 0; j < GlobalVars.productList.Count; j++) 
    { 
     EposProduct selectedProduct = GlobalVars.productList.ElementAt(j); 
     EposProduct dbProduct = dbProducts.ElementAt(i); 
     if(selectedProduct.ProductID == dbProduct.ProductID) 
     { 
      dbProduct.Quantity = selectedProduct.Quantity; 
     } 
    } 
} 
+1

只是一个评论:dbProduct是不是从dbProducts列表,这是你的意图? – 2012-03-22 17:54:16

+1

是的,这是我的一个错字,更新和谢谢。 – conor 2012-03-22 19:48:41

回答

4

您当前有两个嵌套循环的方法是在最好为O(n^2)不计算在内ElementAt方法调用。使用字典,而不是在O(n)中做到这一点:

var gbMap = GlobalVars.productList.ToDictionary(x => x.ProductId, 
               x => x.Quantity); 
foreach(var product in dbProducts) 
{ 
    if(gbMap.ContainsKey(product.ProductId)) 
     product.Quantity = gbMap[product.ProductId]; 
} 
+0

看起来很棒。我确实认为我最终会使用某种字典或散列表。我的数据结构知识已经有点生疏了: - /感谢您的帮助:) – conor 2012-03-22 19:49:52