LINQ变换Dictionary <key,value> to Dictionary <value,key> </value,key> </key,value>

时间:2010-06-03 17:31:56

标签: c# linq

我有一个低脑波日...有没有人知道快速&amp;优雅的方式来转换字典,使键成为值,反之亦然?

示例:

var originalDictionary = new Dictionary<int, string>() {
    {1, "One"}, {2, "Two"}, {3, "Three"}
};

成为

var newDictionary = new Dictionary<string, int>();
// contents:  
// { 
//    {"One", 1}, {"Two", 2}, {"Three", 3} 
// };

4 个答案:

答案 0 :(得分:77)

使用ToDictionary

orignalDictionary.ToDictionary(kp => kp.Value, kp => kp.Key);

这是因为IDictionary<TKey,TElement>;也是IEnumerable<KeyValuePair<TKey,TElement>>;。请注意,如果您有重复值,您将获得例外。

如果您有重复值,则需要决定如何处理它们。一种简单的方法是首先通过对Value进行分组来忽略重复,然后创建字典。

originalDictionary
.ToLookup(kp => kp.Value)
.ToDictionary(g => g.Key, g => g.First().Key);

答案 1 :(得分:9)

你在这里:

var reversed = orignalDictionary.ToDictionary(el => el.Value, el => el.Key);

答案 2 :(得分:0)

我同意所提供的答案,但是您应该考虑并在程序中进行更改以实际设置<key, value>,而不是在之后进行此更改。

答案 3 :(得分:0)

在应用程序中是否存在具有1对1关系或是全局的特定上下文?如果是后者,您可能需要查看BiDirectional Dictionary