Подтвердить что ты не робот

LINQ transform Словарь <ключ, значение> для словаря <значение, ключ>

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

Пример:

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

Ответ 1

Используйте 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);

Ответ 2

Здесь вы находитесь:

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

Ответ 3

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

Ответ 4

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