我有四个对象集合:
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。我不确定是否有更好的解决方法。
答案 0 :(得分:0)
您永远不应该将try-catch
用于程序流,因为抛出处理异常会花费很多时间。事实上,它是一个隐蔽的if-else
。只需添加一个空检查,您就可以通过异常处理获得时间损失:
product.iimar = iimarl.Where(x => x.ARPROD != null
&& x.ARPROD.Equals(productCode))
.ToList();