Uma lista de objetos do Equity Analytics (estoques) fazendo um cálculo para retornos diários. Estava pensando que deveria haver uma solução de pares para fazer isso:
for(int i = 0; i < sdata.Count; i++){
sdata[i].DailyReturn = (i > 0) ? (sdata[i-1].AdjClose/sdata[i].AdjClose) - 1
: 0.0;
}
Respostas:
0 para resposta № 1Eu sou novo no LINQ, eu comecei a usá-lo por causa destackoverflow, então eu tentei jogar com a sua pergunta, e sei que isso pode atrair downvotes, mas eu tentei e ele faz o que você quer no caso de haver pelo menos um elemento na lista.
sdata[0].DailyReturn = 0.0;
sdata.GetRange(1, sdata.Count - 1).ForEach(c => c.DailyReturn = (sdata[sdata.IndexOf(c)-1].AdjClose / c.AdjClose) - 1);
Mas devo dizer que evitar loops não é a melhor prática. Do meu ponto de vista, o LINQ deve ser usado onde for conveniente e não em todos os lugares. Os bons e velhos circuitos são às vezes mais fáceis de manter.
2 para resposta № 2
LINQ apoia: "Linguagem Integrada Inquerir".
O LINQ não deve ser usado e quase não pode ser usado para atribuições, o LINQ não altera o parâmetro IEnumerable fornecido, mas cria um novo.
Como sugerido em um comentário abaixo, há uma maneira de criar um novo IEnumerable com o LINQ, será mais lento e muito menos legível.
Embora o LINQ seja bom, uma coisa importante é saber quando não usá-lo.
Apenas use o bom e velho para loop.