C # Liste <Zeichenfolge> in Wörterbuch <Zeichenfolge, Zeichenfolge> konvertieren

117

Dies mag seltsam erscheinen, aber wenn man das ignoriert, gibt es eine nette, prägnante Möglichkeit, eine Liste in ein Wörterbuch zu konvertieren, wobei jedes Schlüsselwertpaar im Wörterbuch nur jede Zeichenfolge in der Liste ist. dh

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 Komponenten des dritten Teils habe und das Ändern dieser Komponenten nicht in meinen Händen liegt. Einer gibt eine Liste von E-Mail-Adressen als Liste zurück und der andere sendet E-Mails, bei denen der Parameter An ein Wörterbuch ist. Der Schlüssel des Wörterbuchs ist die E-Mail-Adresse und der Wert ist ihr richtiger Name. Ich kenne den richtigen Namen jedoch nicht, aber es funktioniert immer noch, wenn Sie den richtigen Namen auch auf die E-Mail-Adresse setzen. Deshalb möchte ich eine Liste in ein Wörterbuch konvertieren. Dafür gibt es viele Möglichkeiten. Eine foreach-Schleife in der Liste, die einem Wörterbuch eine KVP hinzufügt. Aber ich mag knappen Code und habe mich gefragt, ob es eine einzeilige Lösung gibt.

Jonnster
quelle
1
Ich habe eine bessere Lösung für Ihren triftigen Grund, ehrlich.
2
Möglicherweise möchten Sie überprüfen, ob HashSet <> Ihren Anforderungen entspricht, anstatt Dictionary <,> zu verwenden.
Greg
Direkter als die oben genannten Kommentatoren: Wenn Sie Ihren Grund dafür erklären, kann wahrscheinlich jemand eine bessere Lösung vorschlagen.
Tim S.
1
Es gibt keine bessere Lösung. Ich habe eine Drittanbieter-Komponente, die eine Liste von Zeichenfolgen zurückgibt. Dies sind E-Mail-Adressen. Ich habe eine andere Komponente eines Drittanbieters, die E-Mails sendet, an die ein Wörterbuch <string, string> übergeben wird, wobei der Schlüssel die E-Mail-Adresse und der Wert der tatsächliche Name des Empfängers ist. Der wirkliche Name kann jedoch auch wieder die E-Mail-Adresse sein, weshalb ich eine Liste <string> in ein Wörterbuch <string, string>
konvertieren möchte

Antworten:

243

Versuche dies:

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

Mit dem ersten Lambda können Sie den Schlüssel auswählen, mit dem zweiten den Wert.

Sie können damit spielen und Werte von den Tasten unterscheiden, wie folgt:

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

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

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

BEARBEITEN Um den gültigen Grund zu kommentieren, denke ich, dass der einzige Grund, der für solche Konvertierungen gültig sein könnte, darin besteht, dass die Schlüssel und die Werte im resultierenden Wörterbuch irgendwann voneinander abweichen werden. Beispielsweise würden Sie eine erste Konvertierung durchführen und dann einige der Werte durch etwas anderes ersetzen. Wenn die Schlüssel und Werte immer gleich bleiben, HashSet<String>passt dies viel besser zu Ihrer Situation:

var res = new HashSet<string>(list);
if (res.Contains("string1")) ...
dasblinkenlight
quelle
Dies wird fehlschlagen, wenn Liste wie Zeichenfolge1, Zeichenfolge2, Zeichenfolge3, Zeichenfolge1 ist
Pranay Rana
3
@PranayRana Ja, das würde es. Sie können .Distinct()nach hinzufügen list, um dies zu vermeiden.
Dasblinkenlight
Vielen Dank. Ich habe die ToDictionary-Funktion verpasst. Vielen Dank an alle, die im Grunde die gleiche Antwort gegeben haben. Ich habe alle positiv bewertet, kann aber nur eine Antwort akzeptieren. Dieser war nur einer mit dem hinzugefügten Distinct-Code und war meiner Meinung nach der vollständigste.
Jonnster
11

Benutze das:

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

Weitere Informationen finden Sie unter MSDN .

Wie Pranay in den Kommentaren ausführt, 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);ein Wörterbuch mit verschiedenen Elementen abrufen oder ToLookupstattdessen Folgendes verwenden:

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

Dies gibt einen zurück, ILookup<string, string>der im Wesentlichen derselbe ist wie IDictionary<string, IEnumerable<string>>, sodass Sie eine Liste unterschiedlicher Schlüssel mit jeder Zeichenfolgeninstanz darunter haben.

Daniel Hilgarth
quelle
Dies wird fehlschlagen, wenn Liste wie Zeichenfolge1, Zeichenfolge2, Zeichenfolge3, Zeichenfolge1 ist
Pranay Rana
1

Mit ToDictionary:

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

Wenn es möglich ist, dass eine Zeichenfolge wiederholt wird, Distinctrufen Sie entweder zuerst die Liste auf (um Duplikate zu entfernen) oder verwenden Sie ToLookupdiese Option, um mehrere Werte pro Schlüssel zuzulassen.

Lukazoid
quelle
0

Sie können verwenden:

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

BEARBEITEN

Eine andere Möglichkeit, mit Duplikaten umzugehen, besteht darin, dass Sie dies tun können

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

oder


Einfacher Weg ist

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

Aber stellen Sie sicher, dass sich keine Zeichenfolge wiederholt. Wiederum funktioniert der obige Code nicht für Sie

Wenn es eine Zeichenfolge gibt, die sich wiederholt, ist es besser, dies 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
      }
    }
Pranay Rana
quelle