2012-10-04 6 views
0
코드 나는 간단하게 몇 가지 이름을 변경 한

안녕 내가 이상한 최적화 질문이 모두 여기에 일부 상당히 관여 분석을 위해 사용되는 블랙 박스 (즉 I를 본질적으로 mycollobj중첩 루프 최적화

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); 
    } 
} 

통제 할 수 없다). 이 중첩 알고리즘을 실행하는 더 좋은 방법이 있습니까? 어떤 제안이라도 가치가 있으며 어떤 것에 대한 설명이 필요한지 물어보십시오. 감사!

+0

FYI this all works, 그저 느리다. – 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