LINQ преобразовать словарь <ключ, значение> в словарь <значение, ключ> - PullRequest
38 голосов
/ 03 июня 2010

У меня день без мозговых волн ... Кто-нибудь знает о быстром и элегантном способе преобразования словаря, чтобы ключ стал значением, и наоборот?

Пример:

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 ]

79 голосов
/ 03 июня 2010

Использовать ToDictionary ?

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

Это работает, потому что IDictionary<TKey,TElement>; также IEnumerable<KeyValuePair<TKey,TElement>> ;. Просто помните, что если у вас есть повторяющиеся значения, вы получите исключение.

Если у вас есть повторяющиеся значения, вам нужно будет решить, что с ними делать. Одним простым способом было бы игнорировать дубликаты, сначала сгруппировав значение, а затем составив словарь.

originalDictionary
.ToLookup(kp => kp.Value)
.ToDictionary(g => g.Key, g => g.First().Key);
9 голосов
/ 03 июня 2010

Вот вы:

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

0 голосов
/ 05 апреля 2014

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

0 голосов
/ 03 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...