如何将具有唯一键的字典列表转换为值为列表的字典?

时间:2011-10-13 17:03:09

标签: c#-4.0 data-structures

我有一个任意数量的字典(列表已经按顺序排列),我希望外连接。例如,对于 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#代码来完成此任务?

1 个答案:

答案 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,那么在分配之后您将使用该值初始化该数组。