2013-09-27 3 views
0

Для некоторого представления данных в реальное время, я использую два словарь, которые должны быть объединено:Объединение вложенного dictonaries в C#

//Orderdata string,orderdetails int,day int,hour int,count 
var OldData = new Dictionary<string, Dictionary<int, Dictionary<int, Dictionary<int, int>>>>(); 
var TodayData = new Dictionary<string, Dictionary<int, Dictionary<int, Dictionary<int, int>>>>(); 

Что является лучшим, чтобы объединить эти два словарь?

В этой ситуации я уверен, что есть некоторые дублируют

+14

Во-первых, я бы рассмотрел возможность изменения структуры данных для начала. Это ужасно глубокое вложение - если вы создали именованные типы с четкими значениями, которые * содержали словари, было бы намного легче понять. Это также даст вам возможность поместить метод «Слияние» на каждом уровне ... –

ответ

1

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

private void MergeDictionaries() 
{ 
    var oldData = new Dictionary<string, Dictionary<int, Dictionary<int, Dictionary<int, int>>>>(); 
    var todayData = new Dictionary<string, Dictionary<int, Dictionary<int, Dictionary<int, int>>>>(); 

    foreach (var kvp in oldData) 
    { 
     Dictionary<int, Dictionary<int, Dictionary<int, int>>> today; 
     if (!todayData.TryGetValue(kvp.Key, out today)) 
     { 
      today = new Dictionary<int, Dictionary<int, Dictionary<int, int>>>(); 
      todayData.Add(kvp.Key, today); 
     } 

     foreach (var kvp2 in kvp.Value) 
     { 
      Dictionary<int, Dictionary<int, int>> today2; 
      if (!today.TryGetValue(kvp2.Key, out today2)) 
      { 
       today2 = new Dictionary<int, Dictionary<int, int>>(); 
       today.Add(kvp2.Key, today2); 
      } 

      foreach (var kvp3 in kvp2.Value) 
      { 
       Dictionary<int, int> today3; 
       if (!today2.TryGetValue(kvp3.Key, out today3)) 
       { 
        today3 = new Dictionary<int, int>(); 
        today2.Add(kvp3.Key, today3); 
       } 

       foreach (KeyValuePair<int, int> kvp4 in kvp3.Value) 
       { 
        // What you do here determines what happens when there are key duplicates 
        today3[kvp4.Key] = kvp4.Value; 
       } 
      } 
     } 
    } 
} 
+0

Вы также можете добиться аналогичных результатов с гораздо меньшим количеством кода, используя функцию «SelectMany» Linq. – James

+1

Да, вы могли бы, но иметь дело с глубоким гнездом привело бы к некоторому уродливому LINQ, который я считаю. Кроме того, что угодно, LINQ должен пройти через IEnumerable, а затем воссоздать совершенно новый словарь, а не объединять элементы одного в другой. –

+0

Я надеялся на функцию «Слияние», которая сделала это или простой метод расширения для этого. Последнее значение - это счет, который можно просто суммировать там, где это необходимо. Однако данное решение подходит к вопросу красиво, спасибо !. – CodingBarfield

Смежные вопросы