Суммирование значений словаря в C#

Я пытаюсь суммировать некоторые значения за год. Мой код выполняется в день, поэтому после вычислений мне нужно суммировать эти значения. Цель состоит в том, чтобы экспортировать их обратно в SQL. Я уже настроил таблицу, и мне удалось экспортировать в нее некоторые значения, но только ежедневные, а не годовые.

// 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;
   }
}

Значения справа (optResultYear.) имеют значения, и они рассчитываются по мере необходимости. Однако при добавлении их в свой словарь я получаю только значения NULL.

Кто-нибудь знает, как решить эту проблему или знает лучший вариант?

Почему вы используете «+ = "? Нуль плюс значение — это ноль.

jdweng 04.06.2024 14:56
var yr = yearlyResults[co]; yr.OptTotalDos = (yr.OptTotalDos ?? 0f) + (float)optResultYear.OptTotalDos; yr.OptDos1 = (yr.OptDos1 ?? 0f) + (float)optResultYear.OptDos1; .... Но пусть это можно будет сделать в SQL с помощью агрегатов GROUP BY YEAR(date) и SUM(xy).
Olivier Jacot-Descombes 04.06.2024 15:03

@jdweng Я все еще новичок в C#, поэтому не знал, что словари автоматически имеют нулевые значения.

Markje 04.06.2024 15:14

@OlivierJacot-Decombes Спасибо за это, мне нужно, чтобы это было сделано на C# вместо SQL, но ??0f работает по мере необходимости. Спасибо вам, ребята, за вашу помощь.

Markje 04.06.2024 15:18

Обязательное предупреждение об использовании типов с плавающей запятой для денежных сумм. Суммы могут привести не к тому, чего вы ожидаете.

Fildor 04.06.2024 15:54

Кроме того, float — ужасный тип для использования в качестве ключа словаря: два значения с плавающей запятой, которые должны быть идентичными, могут иметь разные фактические значения и хэш-коды. Поскольку вы используете фиксированный набор постоянных значений, вы, вероятно, этого не видите, но integer было бы лучше (уменьшив их на 100).

D Stanley 04.06.2024 16:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
93
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Решение заключалось в том, что добавление значения NULL к фактическому значению превращается в значение NULL. Поэтому,

var yr = yearlyResults[co];

yr.OptTotalDos = (yr.OptTotalDos ?? 0f) + (float)optResultYear.OptTotalDos;  

Добавление yr.OptTotalDos ?? 0f гарантировало, что если значение равно NULL, то значение будет изменено на 0, что приведет к продолжению вычислений.

Ответ принят как подходящий

Обратите внимание, что значение по умолчанию для типа, допускающего значение NULL, — null и null распространяется. То есть, null + x == null.

Вы можете использовать оператор объединения нулей ??, чтобы преобразовать нулевое значение в желаемое значение.

То есть, (null ?? n) + x == n + x

var yr = yearlyResults[co];
yr.OptTotalDos = (yr.OptTotalDos ?? 0f) + (float)optResultYear.OptTotalDos;
yr.OptDos1 = (yr.OptDos1 ?? 0f) + (float)optResultYear.OptDos1;
yr.OptDos2 = (yr.OptDos2 ?? 0f) + (float)optResultYear.OptDos2;
yr.OptCost = (yr.OptCost ?? 0f) + (float)optResultYear.OptCost;
yr.OptProductie = (yr.OptProductie ?? 0f) + (float)optResultYear.OptProductie;

var yrCOo2 = yearlyResultsCO2[co];
yrCOo2.OptConcLp = (yrCOo2.OptConcLp ?? 0f) + (float)optResultYear.OptConcLp;
yrCOo2.Datum = date;

Я предполагаю, что словарные записи относятся к типу класса (т. е. ссылочному типу). Тогда вы сможете получить доступ к словарю только один раз, присвоив записи временной переменной: var yr = yearlyResults[co];.

Вы должны быть осторожны со структурами, поскольку словарь вернет вам их копию вместо ссылки. Если бы это была структура, вам пришлось бы снова вставить ее в словарь в конце: yearlyResults[co] = yr;

Другие вопросы по теме