2010-06-03 12 views
33

Estoy teniendo un día de onda cerebral baja ... ¿Alguien sabe de una forma rápida & rápida de transformar un diccionario para que la clave se convierta en el valor y viceversa?Transformación de LINQ Diccionario <key,value> al Diccionario <value,key>

Ejemplo:

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

convierte

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

Respuesta

68

Uso ToDictionary?

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

Esto funciona porque IDictionary<TKey,TElement>; es también un IEnumerable<KeyValuePair<TKey,TElement>>;. Solo tenga en cuenta que si tiene valores duplicados, obtendrá una excepción.

En caso de que tenga valores duplicados, tendrá que decidir qué hacer con ellos. Una manera simple sería ignorar los duplicados agrupando primero en Valor y luego crear el diccionario.

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

+1 Excelente manera de manejar el problema del valor duplicado. – Stephan

+0

Cuando uso su ejemplo que implica 'ToLookup', obtengo" 'System.Linq.IGrouping >' no contiene una definición para 'Value' ". Tuve que usar 'ToDictionary' solo en mi diccionario. –

+0

@Sarah, parece que está utilizando ToLookup en una secuencia ya agrupada. – driis

6

aquí están:

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

0

Estoy de acuerdo con las respuestas proporcionadas, sin embargo se debe considerar y hacer el cambio en su programa para la creación efectiva con el <key, value> en vez de hacer este cambio después.

+0

De acuerdo en principio. Pero el problema es que el diccionario original tiene un propósito específico, y en lugar de hacer otra llamada de emergencia, es más conveniente transformar lo que tengo para otra biblioteca que necesita la misma información pero con la clave/valor invertido. – code4life

+0

Ya veo - cosas buenas. – VoodooChild

0

¿Existe un contexto particular en la aplicación en el que tiene una relación de 1 a 1 o es global? Si es este último, es posible que desee consultar un BiDirectional Dictionary.

Cuestiones relacionadas