我有一个任意数量的字典(列表已经按顺序排列),我希望外连接。例如,对于 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]
也就是说,dctOutput
的密钥集等于lstInput
中每个字典的密钥集的并集。此外,dctOutput
中每个值的* i * th位置等于lstInput
中* i * th字典中相应键的值,如果没有,则0
相应的密钥。
如何编写C#代码来完成此任务?
答案 0 :(得分:0)
以下应该做你想做的事。
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,那么在分配之后您将使用该值初始化该数组。