Esto puede parecer algo extraño, pero ignorando eso, ¿existe una forma concisa y agradable de convertir una lista en diccionario donde cada par de valores 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 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 terceros 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 Para 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 establece el nombre real en la dirección de correo electrónico. 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 conciso y me preguntaba si habría una solución de una sola línea.
fuente
Respuestas:
Prueba esto:
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, así:
Si su lista contiene duplicados, agregue
Distinct()
así:EDITAR Para comentar 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 algo más. Si las claves y los valores siempre van a ser los mismos,
HashSet<String>
se adaptarían mucho mejor a su situación:fuente
.Distinct()
despuéslist
para evitar esto.Utilizar este:
Consulte MSDN para obtener 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 usarToLookup
en su lugar:Esto devolverá un
ILookup<string, string>
que es esencialmente el mismo queIDictionary<string, IEnumerable<string>>
, por lo que tendrá una lista de claves distintas con cada instancia de cadena debajo.fuente
Utilizando
ToDictionary
:Si es posible que se repita cualquier cadena,
Distinct
primero haga una llamada en la lista (para eliminar los duplicados), o use laToLookup
que permita múltiples valores por clave.fuente
Puedes usar:
fuente
EDITAR
otra forma de lidiar con los duplicados es hacerlo así
o
una forma fácil de hacerlo es
pero asegúrese de que no haya una cadena que se repita ... nuevamente, de lo contrario, el código anterior no funcionará para usted
si hay una cadena que se repite, es mejor hacerlo así
fuente