2012-07-20 38 views
58

Esto puede parecer algo extraño de querer hacer, pero ignorando eso, ¿hay alguna forma concisa y agradable de convertir una Lista en Diccionario donde cada Par de Valor Clave en el Diccionario es solo cada cadena en la lista. es decir,C# Convert List <string> a Dictionary <string, string>

List = string1, string2, string3 
Dictionary = string1/string1, string2/string2, string3/string3 

he hecho un montón de búsqueda y hay literalmente docenas de ejemplos en Stackoverflow solo de hacerlo en la dirección opuesta, pero no de esta manera todo el año.

La razón para hacer esto es que tengo dos componentes de la tercera parte y cambiarlos está fuera de mis manos. Uno devuelve una lista de direcciones de correo electrónico como una lista y el otro envía correos electrónicos donde el parámetro To es un diccionario. La clave del diccionario es la dirección de correo electrónico y el valor es su nombre real. Sin embargo, no sé el nombre real, pero aún funciona si establece el nombre real en la dirección de correo electrónico también. Por lo tanto, ¿por qué quiero convertir una lista en un diccionario? Hay muchas formas de hacer esto. Un bucle foreach en la lista que agrega un kvp a un diccionario. Pero me gusta el código breve y me pregunté si había una sola solución de línea.

+1

tengo una mejor solución para su razón válida, honesto. – Will

+2

Es posible que desee ver si HashSet <> cumple con sus requisitos, en lugar de utilizar Dictionary <,>. – Greg

+0

Más directamente que los comentadores anteriores: si explica su razón para querer esto, alguien probablemente puede sugerir una mejor solución. –

Respuesta

124

Prueba esto:

var res = list.ToDictionary(x => x, x => x); 

La primera lambda le permite elegir la tecla, el segundo recoge el valor.

Puede jugar con él y hacer que los valores difieren de las claves, así:

var res = list.ToDictionary(x => x, x => string.Format("Val: {0}", x)); 

Si su lista contiene duplicados, añadir Distinct() así:

var res = list.Distinct().ToDictionary(x => x, x => x); 

EDITAR Para comentar por la razón válida, creo que la única razón que podría ser válida para conversiones como esta es que en algún punto las claves y los valores en el diccionario resultante van a divergir. Por ejemplo, haría una conversión inicial y luego reemplazaría algunos de los valores por otra cosa. Si las claves y los valores son siempre va a ser la misma, HashSet<String> proporcionaría un ajuste mucho mejor para su situación:

var res = new HashSet<string>(list); 
if (res.Contains("string1")) ... 
+0

; esta lista fallará si lista es como cadena1, cadena2, cadena3, cadena1 –

+3

@PranayRana Sí , sería. Puede agregar '.Distinct()' después de 'list' para evitar esto. – dasblinkenlight

+0

Gracias. Me perdí la función ToDictionary. Gracias a todos los que básicamente dieron la misma respuesta. Subí a todos, pero solo puedo aceptar una respuesta. Este fue solo uno con el código Distinct agregado, así que fue el más completo en mi opinión. – Jonnster

7

Utilice esta:

var dict = list.ToDictionary(x => x); 

Ver MSDN para obtener más información.

Como señala Pranay en los comentarios, esto fallará si existe un elemento en la lista varias veces.
Dependiendo de sus necesidades específicas, puede utilizar var dict = list.Distinct().ToDictionary(x => x); para conseguir un diccionario de elementos distintos o puede utilizar ToLookup lugar:

var dict = list.ToLookup(x => x); 

Esto devolverá un ILookup<string, string> que es esencialmente el mismo que IDictionary<string, IEnumerable<string>>, por lo que se tener una lista de claves distintas con cada instancia de cadena debajo de ella.

+0

esto fallará si la lista es como string1, string2, string3, string1 –

+0

@PranayRana: Tiene razón. Arreglado. –

1

Mediante el uso de ToDictionary:

var dictionary = list.ToDictionary(s => s); 

Si es posible que cualquier cadena podría repetirse, o bien hacer una llamada Distinct primero en la lista (para eliminar duplicados), o utilizar ToLookup que permite múltiples valores por llave.

0

EDITAR

otra manera de tratar con duplicado se puede hacer como esto

var dic = slist.Select((element, index)=> new{element,index}) 
      .ToDictionary(ele=>ele.index.ToString(), ele=>ele.element); 

o


manera fácil de hacer es

var res = list.ToDictionary(str => str, str=> str); 

pero asegúrese de que no hay ninguna cadena se repite de nuevo ... otherewise por encima de código no funciona para usted

si hay cadena es la repetición de lo que es mejor hacer como esto

Dictionary<string,string> dic= new Dictionary<string,string>(); 

    foreach(string s in Stringlist) 
    { 
     if(!dic.ContainsKey(s)) 
     { 
     // dic.Add(value to dictionary 
     } 
    } 
-1

Se puede utilizar:

var dictionary = myList.ToDictionary(x => x); 
Cuestiones relacionadas