C # Convert List to Dictionary

Esto puede parecer algo extraño, pero ignorarlo, hay una buena forma concisa de convertir una Lista en Diccionario donde cada Par de Valor Clave en el Diccionario es solo cada cadena en la Lista. es decir

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

He hecho muchas búsquedas y hay literalmente docenas de ejemplos en Stackoverflow solo de hacerlo en la dirección opuesta pero no de esta manera.

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 la otra envía correos electrónicos donde el parámetro A 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 también configura el nombre real a la dirección de correo electrónico. Por lo tanto, ¿por qué quiero convertir una lista en un diccionario. Hay muchas maneras de hacer esto. Un bucle foreach en la lista que agrega un kvp a un diccionario. Pero me gusta el código conciso y me preguntaba si había una solución de línea única.

Prueba esto:

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

La primera lambda le permite elegir la clave, la segunda elige el valor.

Puedes jugar con él y hacer que los valores difieran de las teclas, como esto:

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

Si su lista contiene duplicados, agregue Distinct() esta manera:

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

EDITAR Para comentar sobre 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 momento 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 con otra cosa. Si las claves y los valores siempre van a ser los mismos, HashSet proporcionaría un ajuste mucho mejor para su situación:

 var res = new HashSet(list); if (res.Contains("string1")) ... 

Utilizar esta:

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

Ver MSDN para más información.

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

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

Esto devolverá una ILookup que es esencialmente igual a IDictionary> , por lo que tendrá una lista de claves distintas con cada instancia de cadena debajo.

Usando ToDictionary :

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

Si es posible que se pueda repetir cualquier cadena, haga una llamada Distinct primero en la lista (para eliminar duplicados), o use ToLookup que permite múltiples valores por clave.

EDITAR

Otra forma de lidiar con el duplicado es que puedes hacer 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 haya ninguna cadena que se repita … de nuevo, de lo contrario, el código anterior no funcionará para usted

Si hay una cadena se repite que es mejor hacer así.

 Dictionary dic= new Dictionary (); foreach(string s in Stringlist) { if(!dic.ContainsKey(s)) { // dic.Add( value to dictionary } } 

Puedes usar:

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