我在另一个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
答案 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)允许实体框架将你的查询翻译成在数据库上执行的东西。
您还可以使用Sum
和Max
创建一个可在数据库上执行的查询。
答案 2 :(得分:0)
降低代码速度的一个可能原因是这种情况:
if (!exposures.Contains(exposure))
如果最终订单或商品无关紧要,或者您可以稍后对其进行分类,我建议您将其替换为
var exposures = new HashSet<SourceCounterPartyExposure_Limit> ();
如果SourceCounterPartyExposure_Limit类具有良好的散列函数,则搜索速度应该快(接近O(1)),并且可能会大大提高代码的整体性能。
也可能您可以更改算法以在多个线程中运行,然后组合结果。但不确定这是否适合你。