如何从一组较大的对象中快速创建新的对象集合?

时间:2014-10-30 09:56:44

标签: c# linq collections parallel-processing

我有四个对象集合:

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

首先,我得到一个独特的产品代码列表,我想创建新产品&#39;产品&#39;对象来自:

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

try catch是因为Product对象不会总是有IIMAR00或PRODUCTINF的实例。

我提出的解决方案非常缓慢,在i5上接管2:30。我不确定是否有更好的解决方法。

1 个答案:

答案 0 :(得分:0)

您永远不应该将try-catch用于程序流,因为抛出处理异常会花费很多时间。事实上,它是一个隐蔽的if-else。只需添加一个空检查,您就可以通过异常处理获得时间损失:

product.iimar = iimarl.Where(x => x.ARPROD != null 
                               && x.ARPROD.Equals(productCode))
                      .ToList();