Foreach声明需要很长时间

时间:2015-09-17 20:48:34

标签: c# performance linq foreach

我在另一个foreach语句中有一个foreach语句,这个语句需要很长时间才能完成。 (有很多记录)。有没有办法简化这段代码?也许与Linq?这是我的代码:

IList<SourceCounterPartyExposure_Limit> exposures = new List<SourceCounterPartyExposure_Limit>();

foreach (SourceCounterParty counterParty in limit.SourceCounterParties)
{
    foreach (SourceCounterPartyExposure_Limit exposure in counterParty.LimitExposures)
    {
        if (!exposures.Contains(exposure))
        {
            arExposures += exposure.ARExposure;
            mtmExposures += exposure.MTMExposure;
            volumeExposures += exposure.ConvertedVolume;
            if (maxTenorExposures < exposure.MaxTenor) 
             {maxTenorExposures = exposure.MaxTenor; }
            exposures.Add(exposure);
        } // if
    } // foreach
}// foreach

3 个答案:

答案 0 :(得分:3)

您当然可以简化代码:

IEnumerable<Exposure> exposures = 
  limit.SourceCounterParties.SelectMany(e => e.LimitExposures).Distinct()

折叠你的循环和if语句。您可以foreach对其进行操作并运行代码:

foreach (Exposure exposure in exposures)
{
    arExposures += exposure.ARExposure;
    mtmExposures += exposure.MTMExposure;
    volumeExposures += exposure.ConvertedVolume;
    if (maxTenorExposures < exposure.MaxTenor) 
       {maxTenorExposures = exposure.MaxTenor; 
}

话虽如此,它仍然是一个很大的枚举,你不会在这里获得 ton 的速度。

答案 1 :(得分:2)

尝试单循环:

limit.SourceCounterParties.SelectMany(x => x.LimitExposures).Distinct()

这样你(i)只从数据库中获取不同的记录,并且(ii)允许实体框架将你的查询翻译成在数据库上执行的东西。

您还可以使用SumMax创建一个可在数据库上执行的查询。

答案 2 :(得分:0)

降低代码速度的一个可能原因是这种情况:

if (!exposures.Contains(exposure))

如果最终订单或商品无关紧要,或者您可以稍后对其进行分类,我建议您将其替换为

var exposures = new HashSet<SourceCounterPartyExposure_Limit> ();

如果SourceCounterPartyExposure_Limit类具有良好的散列函数,则搜索速度应该快(接近O(1)),并且可能会大大提高代码的整体性能。

也可能您可以更改算法以在多个线程中运行,然后组合结果。但不确定这是否适合你。