2014-10-30 2 views
0

У меня есть четыре коллекции объектов:Как быстро создать новую коллекцию объектов из коллекции больших объектов?

public static ConcurrentBag<string> ProductCodes; 
public static ConcurrentDictionary<string, Product> ProductDictionary; 
public static ConcurrentBag<IIMIM00> iimiml; // 37782 items 
public static ConcurrentBag<IIMAR00> iimarl; // 73516 items 
public static ConcurrentBag<PRODUCTINF> additionall; // 6238 items 
public static ConcurrentBag<PF_COSSTO> ProductsAndCosts; // 862096 items 

Итак, прежде всего я получаю уникальный список кодов продуктов, я хочу, чтобы создать новые объекты «продукт» из:

Parallel.ForEach(ProductsAndCosts, i => ProductCodes.Add(i.improd)); 
ProductCodes = new ConcurrentBag<string>(ProductCodes.Distinct().ToList()) 

Класс продукта:

public class Product 
{ 
    public IIMIM00 iimim { get; set; } 
    public List<IIMAR00> iimar { get; set; } 
    public PRODUCTINF productAdditional { get; set; } 
} 

Моя процедура сортировки и создать словарь с кодом продукта и объекта продукта:

Parallel.ForEach(ProductCodes, SortandCreate);  

public static void SortandCreate(string productCode) 
{ 
    var product = new Product {iimim = iimiml.Single(x => x.IMPROD.Equals(productCode))}; 
    try 
    { 
     product.iimar = iimarl.Where(x => x.ARPROD.Equals(productCode)).ToList(); 
    } 
    catch (Exception) 
    { 
     product.iimar = new List<IIMAR00>(); 
    } 
    try 
    { 
     product.productAdditional = additionall.Single(x => x.PRODUCTCOD.Equals(productCode)); 
    } 
    catch (Exception) 
    { 
     product.productAdditional = new PRODUCTINF(); 
    } 

    ProductDictionary.TryAdd(productCode, product); 
} 

Уловители попыток есть, потому что объект продукта обычно не имеет экземпляра IIMAR00 или PRODUCTINF.

Решение, которое я придумал, очень медленно занимает более 2:30 на i5. Я не уверен, есть ли лучший способ обойти это.

ответ

0

Вы не должны использовать try-catch для потока программы, потому что бросать исключения для обработки занимает много времени. На самом деле это скрытый if-else. Просто добавьте нулевую проверку, и вы потеряете время, затраченное на обработку исключений:

product.iimar = iimarl.Where(x => x.ARPROD != null 
           && x.ARPROD.Equals(productCode)) 
         .ToList(); 
Смежные вопросы