developers c# list dictionary

developers - C#Convert List<string> a Dictionary<string, string>



freshdesk developers (5)

Esto puede parecer una cosa extraña de querer hacer, pero ignorando eso, ¿hay alguna manera agradable y 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 realizado muchas búsquedas y, literalmente, hay docenas de ejemplos en Stackoverflow que lo hacen 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 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.


Al usar ToDictionary :

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

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


Prueba esto:

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

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

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

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 el motivo válido, 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 por otra cosa. Si las claves y los valores van a ser siempre los mismos, HashSet<String> proporcionaría un ajuste mucho mejor para su situación:

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


Puedes usar:

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


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á un ILookup<string, string> que es esencialmente lo mismo que IDictionary<string, IEnumerable<string>> , por lo que tendrá una lista de claves distintas con cada instancia de cadena debajo de él.


EDITAR

Otra forma de lidiar con duplicados es que puedes hacer esto

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

o

una forma fácil de hacerlo es

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

pero asegúrese de que no haya ninguna cadena repitiéndose ... otra vez el código de arriba no funcionará para usted

si hay una cadena repitiéndose, es mejor hacer esto

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