2010-06-03 3 views
33

У меня низкий мозговой день ... Кто-нибудь знает о быстром изящном способе преобразования Словаря, чтобы ключ стал значением и наоборот?LINQ transform Словарь <key,value> to Dictionary <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

+0

Когда я использую ваш пример с участием «ToLookup», я получаю «System.Linq.Grouping >» не содержит определения для «Значение» ». Мне пришлось использовать «ToDictionary» в моем словаре. –

+0

@Sarah, похоже, что вы используете ToLookup в уже сгруппированной последовательности. – driis

6

Здесь вы:

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

0

Я согласен с ответами при условии, однако, вы должны рассмотреть и внести изменения в вашей программе на самом деле установить с <key, value> вместо того, чтобы это изменение после.

+0

Согласовано в принципе. Но проблема в том, что исходный словарь выполняет определенную задачу и вместо того, чтобы делать другой вызов мыла, более удобно преобразовать то, что у меня есть для другой библиотеки, которая нуждается в той же информации, но с изменением ключа/значения. – code4life

+0

Я вижу - хороший материал. – VoodooChild

0

Существует ли конкретный контекст в приложении, где у вас есть отношение 1 к 1 или оно глобально? Если последний, вы можете проверить BiDirectional Dictionary.

Смежные вопросы