我需要优化以下需要 20 秒才能运行的循环:
foreach (IGrouping<DateTime, DateTime> item in groups)
{
var countMatchId = initialGroups
.Where(grp => CalculateArg(grp.a.Arg) == item.Key && grp.b.Arg == someId)
.Sum(y => y.c.Value);
var countAll = initialGroups
.Where(grp => CalculateArg(grp.a.Arg) == item.Key)
.Sum(y => y.c.Value);
}
...其中 CalculateArg 是一个相对昂贵的函数。我想,CalculateArg 一定是罪魁祸首,因此只能在一个查询中使用,所以我想出了这个:
foreach (IGrouping<DateTime, DateTime> item in groups)
{
var result = initialGroups
.Where(grp => CalculateArg(grp.a.Arg) == item.Key);
var countMatchId = result
.Where(x => x.c.Arg == someId).Sum(y => y.c.Value);
var countAll = result
.Sum(y => y.c.Value);
这个结果的问题在于它只节省了大约 200 毫秒,因此没有优化任何东西。对于 countMatchId,我仍然有迭代所有元素的.Where()和也迭代所有元素的.Sum()。然后另一个用于 countAll 的.Sum()迭代所有元素。
我该如何进一步优化呢?我敢肯定,我缺少一些明显的东西。