在字典中反转键和值

时间:2013-10-22 12:56:00

标签: c# linq dictionary

我想要反转字典的键和值。来自源词典Dictionary<int, string>,我想得到Dictionary<string, List<int>>。有List<int>因为该值可以在不同的键下多次在源词典中。

示例:

{
  1: "A"
  2: "A"
  3: "A"
  4: "B"
  5: "B"
  6: "C"
  7: "D"
}

将转换为:

{
  "A": [1,2,3]
  "B": [4,5]
  "C": [6]
  "D": [7]
}

感谢您的帮助。

修改

好的,在你们的帮助下,我能够理解这个算法。 现在我看到两种可能的解决方案(除其他外)并且不知道它们之间的真正区别是什么,因为结果似乎是相同的。

是否有任何性能问题?

var byLookup = actions.ToLookup(pair => pair.Value, pair => pair.Key)
    .ToDictionary(group => group.Key, group => group.AsEnumerable());
var byGroupBy = actions.GroupBy(pair => pair.Value, pair => pair.Key)
    .ToDictionary(group => group.Key, group => group.AsEnumerable());

编辑2:

我最终只使用

var byLookup = actions.ToLookup(pair => pair.Value, pair => pair.Key)

我没想到会这么简单。 谢谢大家。

3 个答案:

答案 0 :(得分:26)

这是一个相当简单的LINQ表达式:

var res = dict
    .GroupBy(p => p.Value)
    .ToDictionary(g => g.Key, g => g.Select(pp => pp.Key).ToList());

首先,按值分组。这会创建以字符串作为键的组,并将KeyValuePair<int,string>作为项目。

然后,您可以使用字典键的组键将组转换为字典,并将原始字典的键“展平”为ToList()列表。

答案 1 :(得分:4)

您还可以按如下方式获得所需的结果:

var result = source
    .GroupBy(x => x.Value, x => x.Key)
    .ToDictionary(g => g.Key, g => g.ToList());

这给出与dasblinkenlight相同的结果,但将KeyValuePair的映射移动到group by子句

答案 2 :(得分:0)

dic = {1: "A",  2: "A",  3: "A",  4: "B",  5: "B",  6: "C",  7: "D"}

rev_dic = {}
for key in dic:
    new_value = dic[key]
    if not new_value in rev_dic:
        rev_dic[new_value] = []
    rev_dic[new_value].append(key)

for new_value in rev_dic:
    rev_dic[new_value].sort()

print(rev_dic)

将打印:

{'A': [1, 2, 3], 'B': [4, 5], 'C': [6], 'D': [7]}