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}
// };
Ответы
Ответ 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.