web-dev-qa-db-fra.com

Liste de conversion C # <chaîne> en Dictionnaire <chaîne, chaîne>

Cela peut sembler une chose étrange à vouloir faire mais ignorer cela, existe-t-il un moyen concis Nice de convertir une liste en dictionnaire où chaque paire de valeurs clés dans le 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 uniquement sur Stackoverflow qui le font dans la direction opposée, mais pas de cette façon.

La raison en est que j’ai deux composants de troisième partie et que je ne les ai pas modifiés. L'une renvoie une liste d'adresses électroniques sous forme de liste et l'autre envoie des adresses électroniques dans lesquelles le paramètre To est un dictionnaire. La clé du dictionnaire est l'adresse email 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 y a beaucoup de façons de faire cela. Une boucle foreach sur la liste qui ajoute un kvp à un dictionnaire. Mais j'aime bien le code laconique et je me suis demandé s'il n'y avait qu'une solution en une seule ligne.

85
Jonnster

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 rendre les valeurs différentes 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);

EDITPour commenter la raison valable, je pense que la seule raison valable pour les conversions de ce type est qu’à un moment donné les clés et les valeurs du dictionnaire résultant vont diverger. Par exemple, vous effectuez une conversion initiale, puis remplacez certaines des valeurs par quelque chose d'autre. Si les clés et les valeurs sont toujours vont être identiques, HashSet<String> conviendrait beaucoup mieux à votre situation:

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

Utilisez ceci:

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

Voir MSDN pour plus d’informations.

Comme Pranay le fait remarquer dans les commentaires, cela échouera si un élément existe plusieurs fois dans la liste.
Selon vos besoins spécifiques, vous pouvez utiliser var dict = list.Distinct().ToDictionary(x => x); pour obtenir un dictionnaire d'éléments distincts ou utiliser ToLookup à la place:

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

Cela retournera un ILookup<string, string> qui est essentiellement identique à IDictionary<string, IEnumerable<string>>, vous aurez donc une liste de clés distinctes avec chaque instance de chaîne en dessous.

9
Daniel Hilgarth

En utilisant ToDictionary :

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

S'il est possible de répéter une chaîne, effectuez un appel Distinct en premier sur la liste (pour supprimer les doublons) ou utilisez ToLookup qui autorise plusieurs valeurs par clé.

1
Lukazoid

Vous pouvez utiliser:

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

MODIFIER

une autre façon de traiter les doublons est que vous pouvez faire comme ça 

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

ou 


moyen facile à 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 qui se répète, mieux vaut 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
      }
    }
0
Pranay Rana