C # Convertir la liste <chaîne> en dictionnaire <chaîne, chaîne>


117

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.


1
J'ai une meilleure solution pour votre raison valable, honnête.

2
Vous voudrez peut-être voir si HashSet <> répond à vos exigences, au lieu d'utiliser Dictionary <,>.
Greg

Plus directement que les commentateurs ci-dessus: si vous expliquez votre raison de vouloir cela, quelqu'un peut probablement suggérer une meilleure solution.
Tim S.

1
Il n'y a pas de meilleure solution. J'ai un composant tiers qui renvoie une liste de chaînes, ce sont des adresses e-mail. J'ai un autre composant tiers qui envoie des e-mails où il passe un Dictionary <string, string> où la clé est l'adresse e-mail et la valeur est le nom réel du destinataire. Cependant, le vrai nom peut aussi être à nouveau l'adresse e-mail, c'est pourquoi je veux convertir une liste <chaîne> en dictionnaire <chaîne, chaîne>
Jonnster

Réponses:


244

Essaye ça:

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

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:

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

Si votre liste contient des doublons, ajoutez Distinct()comme ceci:

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

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:

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

cela échouera si la liste est comme string1, string2, string3, string1
Pranay Rana

3
@PranayRana Oui, ça le ferait. Vous pouvez ajouter .Distinct()après listpour éviter cela.
dasblinkenlight

Merci. J'ai raté la fonction ToDictionary. Merci à tous ceux qui ont donné la même réponse. J'ai voté pour tout le monde mais je ne peux accepter qu'une seule réponse. Celui-ci était le seul avec le code distinct ajouté, c'était donc le plus complet à mon avis.
Jonnster

11

Utilisez ceci:

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

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 à la ToLookupplace:

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

Cela renverra un ILookup<string, string>qui est essentiellement le même que IDictionary<string, IEnumerable<string>>, vous aurez donc une liste de clés distinctes avec chaque instance de chaîne en dessous.


cela échouera si la liste est comme string1, string2, string3, string1
Pranay Rana

1

En utilisant ToDictionary:

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

S'il est possible qu'une chaîne puisse être répétée, faites Distinctd'abord un appel sur la liste (pour supprimer les doublons), ou utilisez ToLookupce qui autorise plusieurs valeurs par clé.


0

Vous pouvez utiliser:

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

0

ÉDITER

une autre façon de gérer les doublons est de faire comme ça

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

ou


un moyen facile de faire est

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

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

Dictionary<string,string> dic= new Dictionary<string,string> ();

    foreach(string s in Stringlist)
    {
       if(!dic.ContainsKey(s))
       {
        //  dic.Add( value to dictionary
      }
    }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.