2012-03-22 83 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