code4life
code4life

Reputation: 15794

LINQ transform Dictionary<key,value> to Dictionary<value,key>

I'm having a low-brainwave day... Does anyone know of a quick & elegant way to transform a Dictionary so that the key becomes the value and vice-versa?

Example:

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

becomes

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

Upvotes: 47

Views: 30254

Answers (4)

Tormod
Tormod

Reputation: 4583

Is there a particular context in the application where you have 1-to-1 relation or is it global? If the latter, you may want to check out a BiDirectional Dictionary.

Upvotes: 0

driis
driis

Reputation: 164341

Use ToDictionary ?

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

This works because IDictionary<TKey,TElement>; is also an IEnumerable<KeyValuePair<TKey,TElement>>;. Just be aware that if you have duplicate values, you will get an exception.

In case you have duplicate values, you will need to decide on what to do with them. One simple way would be to ignore duplicates by grouping on Value first, then make the dictionary.

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

Upvotes: 101

VoodooChild
VoodooChild

Reputation: 9784

I agree with the answers provided, however you should consider and make the change in your program to actually set up with the <key, value> instead of making this change after.

Upvotes: 0

Giorgi
Giorgi

Reputation: 30883

Here you are:

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

Upvotes: 9

Related Questions