Estou tentando somar alguns valores ao longo de um ano. Meu código é executado por dia, então preciso somar esses valores após os cálculos. O objetivo é então exportá-los de volta para SQL. Já montei uma tabela e consegui exportar alguns valores para a tabela, mas apenas os valores diários e ainda não os anuais.
// YEAR OVERVIEW
OptResultDataYear optResultDataYear = new OptResultDataYear();
// Variations in price
List<float> varprijs = new List<float> { 0.06f, 0.08f, 0.10f, 0.12f, 0.14f, 0.16f, 0.18f };
// Create dictionaries for storing the values
Dictionary<float, OptResultYear> yearlyResults = varPrijs.ToDictionary(co => co, co => new OptResultYear { AfdelingId = afd.AfdelingsId, variatiePrijs = co });
// SQL output
OptResultYear optResultYear= new OptResultYear();
for (DateTime date = startYear; date < endYear; date = date.AddDays(1))
{
foreach (float co in varprijs)
{
// Calculate the optimal results with the varPrijs
ResultScenDay optResultvar = await DayCalc.RunOcapOptimaalDayAsync(afd.AfdelingsId, date, 3600, (int)ScenarioType.Optimal, co, null); // per dag met uurdata.
// Analyze the code
optResultYear = analysePeriode.FillOptResultYear(afd.AfdelingsId, kenm.TeeltOppHa, date, optResultvar, co, null);
// Collect the required values
yearlyResults[co].OptTotalDos += (float)optResultYear.OptTotalDos;
yearlyResults[co].OptDos1 += (float)optResultYear.OptDos1;
yearlyResults[co].OptDos2 += (float)optResultYear.OptDos2;
yearlyResults[co].OptCost += (float)optResultYear.OptCost;
yearlyResults[co].OptProductie += (float)optResultYear.OptProductie;
yearlyResultsCO2[co].OptConcLp += (float)optResultYear.OptConcLp;
// Set the date for the last entry
yearlyResultsCO2[co].Datum = date;
}
}
Os valores à direita (optResultYear.) possuem valores e são calculados conforme necessário. No entanto, ao adicioná-los ao meu dicionário, obtenho apenas valores NULL.
Alguém sabe como resolver isso ou conhece uma opção melhor?
A solução foi que somar um
NULL
valor com um valor real se transformasse em umNULL
valor. Portanto,Adicionando o
yr.OptTotalDos ?? 0f
garantiu que se o valor forNULL
então o valor seria alterado para0
, fazendo com que ele continuasse calculando.Observe que o valor padrão para um tipo anulável é
null
enull
propaga. Ou seja,null + x == null
.Você pode usar o operador de coalescência nula
??
para converter um valor nulo em um valor desejado.Ou seja,
(null ?? n) + x == n + x
Presumo que as entradas do dicionário sejam de um tipo de classe (ou seja, um tipo de referência). Então você poderá acessar o dicionário apenas uma vez, atribuindo as entradas a uma variável temporária:
var yr = yearlyResults[co];
.Você deve ter cuidado com as estruturas, pois o dicionário retornará uma cópia delas em vez de uma referência. Se fosse uma struct você teria que inseri-la novamente no dicionário no final:
yearlyResults[co] = yr;