C# Convertir List<string> pour Dictionnaire<string, string>
Cela peut sembler une chose étrange à faire, mais ignorant que, est-il une belle manière concise de la conversion d'une Liste de Dictionnaire où chaque Valeur de la Clé de Paire dans le Dictionnaire est uniquement au niveau de chaque chaîne dans la Liste. c'est à dire
List = string1, string2, string3
Dictionary = string1/string1, string2/string2, string3/string3
J'ai fait beaucoup de recherche 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 ronde.
La raison pour cela est que j'ai les deux tiers des composants d'une partie et d'en changer est hors de mes mains. Retourne 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 de leur vrai nom. Cependant, je ne sais pas le vrai nom mais il fonctionne encore si vous définissez le nom réel de l'adresse e-mail ainsi. Donc, pourquoi je veux convertir une Liste à un Dictionnaire. Il ya beaucoup de façons de le faire. Une boucle foreach sur la liste qui ajoute une kvp à un dictionnaire. Mais j'aime bien laconique code et je me demandais si il y avait une seule solution en ligne.
- J'ai une meilleure solution pour votre raison valable, honnête.
- Vous voudrez peut-être voir si HashSet<> répond à vos besoins, au lieu d'utiliser Dictionnaire<,>.
- Plus directement que les commentateurs ci-dessus: Si vous expliquez vos raisons pour vouloir cela, quelqu'un peut sans doute proposer une meilleure solution.
- Il n'y a pas de meilleure solution. J'ai un tiers de la composante qui retourne une liste de chaînes, ce sont des adresses e-mail. J'ai un autre tiers composant qui envoie des mails où il passe un Dictionnaire<string, string> lorsque la clé est l'adresse email de la valeur et de l'bénéficiaires vrai nom. Toutefois, le nom réel peut également être simplement l'adresse e-mail, ce qui est pourquoi je veux convertir une List<string> pour un Dictionnaire<string, string>
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
La première lambda permet de choisir la clé, le second détermine la valeur.
Vous pouvez jouer avec elle et de prendre des valeurs différentes des clés, comme ceci:
Si votre liste contient des doublons, ajouter
Distinct()
comme ceci:MODIFIER un commentaire sur le motif valable, je pense que la seule raison qui pourrait être valable pour les conversions de ce genre est qu'à un moment donné les clés et les valeurs de la résultante dictionnaire vont diverger. Par exemple, vous voulez faire une conversion initiale, puis remplacer certaines valeurs avec quelque chose d'autre. Si les clés et les valeurs sont toujours va être le même,
HashSet<String>
serait de fournir un bien meilleur ajustement pour votre situation:.Distinct()
aprèslist
pour éviter cela.Utiliser ceci:
Voir MSDN pour plus d'info.
Comme Pranay points dans les commentaires, ce sera un échec si un élément existe dans la liste plusieurs fois.
En fonction de vos besoins spécifiques, vous pouvez soit utiliser
var dict = list.Distinct().ToDictionary(x => x);
pour obtenir un dictionnaire d'articles distincts ou vous pouvez utiliserToLookup
à la place:Revenir un
ILookup<string, string>
qui est essentiellement la même queIDictionary<string, IEnumerable<string>>
, de sorte que vous aurez une liste de clés distinctes avec chaque instance string en dessous.En utilisant
ToDictionary
:Si il est possible que n'importe quelle chaîne peut être répétée, soit faire un
Distinct
appeler en premier sur la liste (supprimer les doublons), ou de l'utilisationToLookup
qui permet à plusieurs valeurs par clé.Vous pouvez utiliser:
MODIFIER
une autre façon de traiter avec des doublons, vous pouvez faire comme ceci
ou
moyen facile de le faire est
mais assurez-vous qu'il n'y a aucune chaîne n'est de répéter...encore une fois otherewise code ci-dessus ne fonctionne pas pour vous
si il y a de la chaîne est de répéter qu'il vaut mieux faire comme ça