Альтернатива вложенному циклу для обновления коллекции - PullRequest
1 голос
/ 22 марта 2012

Я получаю список продуктов из моей базы данных в виде 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 Ответ

4 голосов
/ 22 марта 2012

Ваш текущий подход с двумя вложенными циклами в лучшем случае 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];
}
...