wake-up-neo.com

C # Liste <String> in Dictionary <String, String> konvertieren

Dies mag seltsam erscheinen, aber wenn man das ignoriert, gibt es eine prägnante Möglichkeit, eine Liste in ein Dictionary umzuwandeln, wobei jedes Schlüsselwertpaar im Dictionary nur jede Zeichenfolge in der Liste ist. d.h.

List = string1, string2, string3
Dictionary = string1/string1, string2/string2, string3/string3

Ich habe viel gesucht und es gibt buchstäblich Dutzende von Beispielen für Stackoverflow, die es in die entgegengesetzte Richtung tun, aber nicht so.

Der Grund dafür ist, dass ich zwei dritte Teilkomponenten habe und dass ich sie nicht ändern kann. Eine gibt eine Liste von E-Mail-Adressen als Liste zurück und die andere sendet E-Mails, bei denen der Parameter To ein Wörterbuch ist. Der Schlüssel des Wörterbuchs ist die E-Mail-Adresse und der Wert ist ihr richtiger Name. Ich kenne zwar nicht den richtigen Namen, aber es funktioniert immer noch, wenn Sie auch die E-Mail-Adresse als echten Namen festlegen. Deshalb möchte ich eine Liste in ein Wörterbuch umwandeln. Dafür gibt es viele Möglichkeiten. Eine foreach-Schleife in der Liste, die einem Wörterbuch ein kvp hinzufügt. Aber ich mag knappen Code und habe mich gefragt, ob es eine einzeilige Lösung gibt.

85
Jonnster

Versuche dies:

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

Beim ersten Lambda können Sie den Schlüssel auswählen, beim zweiten wird der Wert ausgewählt.

Sie können damit spielen und die Werte von den Tasten abheben.

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

Wenn Ihre Liste Duplikate enthält, fügen Sie Distinct() wie folgt hinzu:

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

EDITUm den gültigen Grund zu kommentieren, denke ich, der einzige Grund, der für solche Konvertierungen gelten könnte, ist der, dass die Schlüssel und die Werte im resultierenden Wörterbuch irgendwann abweichen. Beispielsweise würden Sie eine erste Konvertierung durchführen und dann einige Werte durch etwas anderes ersetzen. Wenn die Schlüssel und die Werte always gleich sind, würde HashSet<String> für Ihre Situation viel besser geeignet sein:

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

Benutze das:

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

Siehe MSDN für weitere Informationen.

Wie Pranay in den Kommentaren hervorhebt, schlägt dies fehl, wenn ein Element mehrmals in der Liste vorhanden ist.
Abhängig von Ihren spezifischen Anforderungen können Sie entweder var dict = list.Distinct().ToDictionary(x => x); verwenden, um ein Wörterbuch mit verschiedenen Elementen zu erhalten, oder Sie können stattdessen ToLookup verwenden:

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

Dadurch wird ein ILookup<string, string> zurückgegeben, der im Wesentlichen derselbe ist wie IDictionary<string, IEnumerable<string>>. Sie haben also eine Liste unterschiedlicher Schlüssel mit jeder Zeichenketteninstanz darunter.

9
Daniel Hilgarth

Mit ToDictionary :

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

Wenn es möglich ist, dass ein beliebiger String wiederholt wird, führen Sie entweder einen Distinct - Aufruf zuerst in der Liste aus (um Duplikate zu entfernen), oder verwenden Sie ToLookup , wodurch mehrere Werte pro Schlüssel möglich sind.

1
Lukazoid

Sie können verwenden:

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

EDIT

eine andere Möglichkeit, mit Duplikaten umzugehen, ist, dass Sie dies wie folgt tun können 

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

oder 


ein einfacher Weg ist es 

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

aber stelle sicher, dass sich keine Zeichenfolge wiederholt ... nochmal oben wird Code nicht funktionieren

wenn sich ein String wiederholt, als es besser ist, so zu tun  

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