如何重构LINQ

本文关键字:LINQ 重构 何重构 | 更新日期: 2023-09-27 17:51:19

如何重构这段代码?

是否有可能使aktuelKurs和kursagen for在同一行?

编辑2

  if (aktiekurser != null)
  {
    int idDato = aktiekurser.Last().IdDato;
    for (int i = 0; i < antalDage; i++)
    {
      aktuelKurs = (from a in aktiekurser
                    where a.IdDato == idDato - i
                    select a.Lukkekurs
                    ).Sum();
      kursDagenFor = (from a in aktiekurser
                    where a.IdDato == idDato - (i + 1)
                    select a.Lukkekurs
                    ).Sum();
      gnsOp += aktuelKurs > kursDagenFor ? aktuelKurs :0m;
    }
  }

如何重构LINQ

这不是很有效。首先,分别查询每个单独的和,其次,在每次迭代中计算在前一次迭代中也计算过的和。

您可以通过在一个分组查询中查询所有所需的总和来提高效率:

var aktuelKurs = from a in aktiekurser
                 where a.IdDato >= idDato - 1 + antalDage
                 group a by a.IdDato into grp
                 select grp.Sum(x => x.Lukkekurs);

现在你有一个小数列表,你必须根据你的规则确定元素是否大于它们的前一个和Sum的结果:

var gnsOp = aktuelKurs.Zip(aktuelKurs.Skip(1), 
                 (prev,act) => act > prev ? act :0m).Sum()