#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, то вы должны инициализировать массив этим значением после его выделения.