Cela peut sembler une chose étrange à faire, mais en ignorant cela, existe-t-il un moyen concis et agréable de convertir une liste en dictionnaire où chaque paire de valeurs clés du dictionnaire est juste chaque chaîne de la liste. c'est à dire
List = string1, string2, string3
Dictionary = string1/string1, string2/string2, string3/string3
J'ai fait beaucoup de recherches et il y a littéralement des dizaines d'exemples sur Stackoverflow seul de le faire dans la direction opposée mais pas de cette façon.
La raison de faire cela est que j'ai deux composants tiers et que je ne peux pas les changer. L'un renvoie une liste d'adresses e-mail sous forme de liste et l'autre envoie des e-mails où le paramètre À est un dictionnaire. La clé du dictionnaire est l'adresse e-mail et la valeur est leur vrai nom. Cependant, je ne connais pas le vrai nom, mais cela fonctionne toujours si vous définissez également le vrai nom sur l'adresse e-mail. Par conséquent, pourquoi je veux convertir une liste en dictionnaire. Il existe de nombreuses façons de procéder. Une boucle foreach sur la liste qui ajoute un kvp à un dictionnaire. Mais j'aime le code laconique et je me suis demandé s'il y avait une solution sur une seule ligne.
la source
Réponses:
Essaye ça:
Le premier lambda vous permet de choisir la clé, le second choisit la valeur.
Vous pouvez jouer avec et faire en sorte que les valeurs diffèrent des clés, comme ceci:
Si votre liste contient des doublons, ajoutez
Distinct()
comme ceci:EDIT Pour commenter la raison valable, je pense que la seule raison qui pourrait être valable pour des conversions comme celle-ci est qu'à un moment donné, les clés et les valeurs dans le dictionnaire résultant vont diverger. Par exemple, vous effectuez une conversion initiale, puis remplacez certaines des valeurs par autre chose. Si les clés et les valeurs sont toujours les mêmes,
HashSet<String>
cela correspondrait beaucoup mieux à votre situation:la source
.Distinct()
aprèslist
pour éviter cela.Utilisez ceci:
Voir MSDN pour plus d'informations.
Comme le souligne Pranay dans les commentaires, cela échouera si un élément existe plusieurs fois dans la liste.
En fonction de vos besoins spécifiques, vous pouvez soit utiliser
var dict = list.Distinct().ToDictionary(x => x);
pour obtenir un dictionnaire d'éléments distincts, soit utiliser à laToLookup
place:Cela renverra un
ILookup<string, string>
qui est essentiellement le même queIDictionary<string, IEnumerable<string>>
, vous aurez donc une liste de clés distinctes avec chaque instance de chaîne en dessous.la source
En utilisant
ToDictionary
:S'il est possible qu'une chaîne puisse être répétée, faites
Distinct
d'abord un appel sur la liste (pour supprimer les doublons), ou utilisezToLookup
ce qui autorise plusieurs valeurs par clé.la source
Vous pouvez utiliser:
la source
ÉDITER
une autre façon de gérer les doublons est de faire comme ça
ou
un moyen facile de faire est
mais assurez-vous qu'aucune chaîne ne se répète ... encore une fois, le code ci-dessus ne fonctionnera pas pour vous
s'il y a une chaîne se répète qu'il vaut mieux faire comme ça
la source