2012-10-04 134 views
0

大家好我有一个奇怪的优化问题,这里是代码我已经改变了一些名字为简单起见嵌套循环优化

CollectionObject mycollobj = new CollectionObject(); 
List<string> MyProducts = new List<string>(); 
//get collection of selected customers that were passed in 
var chckedValues = form.GetValues("assignChkBx"); 
foreach(string customer in chckedValues) 
{ 
    MyProducts.Clear(); 
    //MyProducts is then set to a data access method in my data access class 
    MyProducts = DataLayerClass.GetProductsFromCustomer(customer); 
    foreach(string product in MyProducts) 
    { 
     string item1 = DataLayerClass.GetItem1(product); 
     string item2 = DataLayerClass.GetItem2(product); 
     mycollobj.loaditems(item1, item2); 
    } 
} 

本质mycollobj是用于一些相当复杂的分析,一个黑盒子(即我无法控制)。有没有更好的方法来运行这个嵌套算法?任何建议都很重要,请问你是否需要澄清任何事情。谢谢!

+0

仅供参考这一切都有效,只是缓慢 – Badmiral

+0

如果'mycollobj.loaditems'是缓慢的部分,您可以将该调用移动到后台线程吗? – davisoa

+0

我并不确定什么是缓慢的,整个过程很慢(仍然是这个东西的初学者) – Badmiral

回答

3

是的,这条线:MyProducts = DataLayerClass.GetProductsFromCustomer(customer);会减慢速度(每个客户都需要一个数据库),嵌套的DataLayerClass.GetItem1()/GetItem2也会让事情变得更糟。而是发送了所有的checkedValues到数据库并与客户和含有item1item2一个Tuple返回查找:

ILookup<Customer, Tuple<string, string>> customerProducts = 
DataLayerClass.GetCustomersWithProducts(chckedValues); 

总之而言,移动逻辑到一个单一的数据库查询。

+0

我不确定这会在代码中进行,我们是否将它嵌入到第一个循环中? – Badmiral

+0

也没有客户对象,所以我有点困惑 – Badmiral

+0

不会在任何循环之外完成。然后循环调用'mycollobj.loaditems(item1,item2);'的结果 – Magnus