Как преобразовать список словарей с уникальными ключами в словарь, значением которого является список?

#c#-4.0 #data-structures

#c #-4.0 #структуры данных

Вопрос:

У меня есть произвольное количество словарей (которые находятся в списке, уже в порядке), к которым я хочу присоединиться. Например, для N = 2:

 List<Dictionary<string, int>> lstInput = new List<Dictionary<string, int>>();
Dictionary<string, int> dctTest1 = new Dictionary<string, int>();
Dictionary<string, int> dctTest2 = new Dictionary<string, int>();
dctTest1.Add("ABC", 123);
dctTest2.Add("ABC", 321);
dctTest2.Add("CBA", 321);
lstInput.Add(dctTest1);
lstInput.Add(dctTest2);
  

У каждого словаря уже есть уникальные ключи.

Я хочу преобразовать lstInput в:

 Dictionary<string, int[]> dctOutput = new Dictionary<string, int[]>();
  

где dctOutput выглядит как:

 "ABC": [123, 321]
"CBA": [0, 321]
  

То есть набор ключей of dctOutput равен объединению набора ключей каждого словаря in lstInput ; более того, *i*-я позиция каждого значения in dctOutput равна значению соответствующего ключа в *i*-м словаре in lstInput , или 0 , если соответствующего ключа нет.

Как я могу написать код на C # для достижения этой цели?

Ответ №1:

Следующее должно делать то, что вы хотите.

 var dctOutput = new Dictionary<string, int[]>();
for (int i = 0; i < lstInput.Count;   i)
{
    var dict = lstInput[i];
    foreach (var kvp in dict)
    {
        int[] values;
        if (!dctOutput.TryGetValue(kvp.Key, out values))
        {
            // Allocating the array zeros the values
            values = new int[lstInput.Count];
            dctOutput.Add(kvp.Key, values);
        }
        values[i] = kvp.Value;
    }
}
  

Это работает, потому что выделение массива инициализирует все значения равными 0. Итак, если в предыдущем словаре не было элемента с этим ключом, его значения будут равны 0 в этой позиции. Если вы хотите, чтобы ваше значение sentinel было чем-то отличным от 0, то вы должны инициализировать массив этим значением после его выделения.