Суммарные значения в двойном вложенном списке словарей в C# - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть (по некоторым причинам, чтобы не попасть сейчас ...) список следующей структуры:

List1<Dictionary1<string, List2<Dictionary2<string, string>>>>

(для ясности я добавил именования 1 и 2). Я хочу перебрать List1 и суммировать Dictionary1, чтобы все значения идентичных ключей в Dictionary2 складывались.

Например, если каждый элемент Dictionary1 содержит Dictionary2: {"Price", 23}, {"Customers", 3}

, затем я хочу выполнить итерацию по всем элементам List2 и по всем элементам List1 и получить окончательный словарь общей суммы всех цен и клиентов в качестве единого ключа для каждой категории: {"Цена", 15235}, {"Клиенты", 236}

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

Я считаю, что это можно сделать с помощью LINQ, но я не уверен, как сделай это ..

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Это может быть самая уродливая вещь, которую я когда-либо писал, и она делает некоторые предположения о том, что вы делаете, но я думаю, что это дает вам то, что вы хотите:

var query = from outerDictionary in x
            from listOfDictionaries in outerDictionary.Values
            from innerDictionary in listOfDictionaries
            from keyValuePairs in innerDictionary
            group keyValuePairs by keyValuePairs.Key into finalGroup
            select new
            {
                Key = finalGroup.Key,
                Sum = finalGroup.Sum(a => Convert.ToInt32(a.Value))
            };

Где х ваш главный Список.

0 голосов
/ 19 февраля 2020

Хорошо, похоже, вы пытались создать словарь элементов с различными свойствами (Cost, Customers, et c ...), в связи с чем возникает вопрос: почему бы просто не создать класс?

В конце концов, было бы довольно просто превратить ваш словарь словаря элементов в единый словарь свойств, например, приведенный ниже.

public class ItemProperties 
{
public double Price {get; set;} = 0;
public int Customers {get; set;} = 0;
//Whichever other properties you were thinking of using. 
}

static ItemProperties AddAll(Dictionary<string, ItemProperties> items)
ItemProperties finalitem = new ItemProperties(); 
{
foreach (var item in items) 
{
finalitem.Price += item.Price;
finalitem.Customers += item.Customers;
//Repeat for all other existing properties.
}
return finalitem;
}

Конечно, это работает, только если число и вид свойств неизменен. Другой способ решения этой проблемы - использовать TryParse для поиска свойств в Dictionary2, которые, по вашему мнению, могут быть добавлены. Однако это проблематично c и требует хорошей проверки ошибок.

static Dictionary < string, string > AddNestedDictionary(Dictionary < string, Dictionary < string, string > items) {

 Dictionary < string, string > finalitem = new Dictionary < string, string > ();
 foreach(var item in items) {
  foreach(var prop in item) {
   if (!finalitem.ContainsKey(prop.Key)) {
    finalitem.Add(prop);
   }
   double i = 0;
   if (Double.TryParse(prop.Value, out i)) {
    finalitem[prop.Key] += i;
   }
  }
 }
return finalitem;
}

Опять же, не самый лучший ответ по сравнению с простотой класса c. Но это будет цена, которую вы платите за неясность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...