2010-06-03 92 views
33

我脑波正常的一天...有没有人知道快速&优雅的方式来转换字典,使密钥成为价值,反之亦然?LINQ转换词典<key,value>到词典<value,key>

例子:

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} 
// }; 

回答

68

使用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); 
+4

+1伟大的方式来处理重复值问题。 – Stephan 2010-06-03 17:55:47

+0

当我使用涉及'ToLookup'的示例时,我得到''System.Linq.IGrouping >'不包含'Value'的定义。我不得不在我的字典上单独使用'ToDictionary'。 – 2010-09-27 18:26:45

+0

@Sarah,听起来就像你在已分组的序列上使用ToLookup。 – driis 2010-09-27 19:51:14

6

给你:

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

0

我提供的答案同意,但是你应该考虑,并在你的程序的变化,以实际建立与<key, value>,而不是使这一变化后。

+0

原则同意。但问题是,原始字典服务于特定目的,而不是再进行一次肥皂调用,将另一个需要相同信息但逆向键/值的库转换为更方便。 – code4life 2010-06-03 20:00:31

+0

我看到 - 好东西。 – VoodooChild 2010-06-04 01:47:31

相关问题