Wählen Sie mit LINQ ein Wörterbuch <T1, T2> aus

171

Ich habe das Schlüsselwort "select" und die Erweiterungsmethode verwendet, um ein IEnumerable<T>mit LINQ zurückzugeben, aber ich muss ein generisches zurückgeben Dictionary<T1, T2>und kann es nicht herausfinden. Das Beispiel, aus dem ich dies gelernt habe, hat etwas in einer ähnlichen Form verwendet:

IEnumerable<T> coll = from x in y 
    select new SomeClass{ prop1 = value1, prop2 = value2 };

Das gleiche habe ich auch mit Erweiterungsmethoden gemacht. Ich nahm an, dass ich, da die Elemente in a Dictionary<T1, T2>iteriert werden können KeyValuePair<T1, T2>, "SomeClass" im obigen Beispiel durch " new KeyValuePair<T1, T2> { ..." ersetzen könnte , aber das funktionierte nicht (Schlüssel und Wert wurden als schreibgeschützt markiert, sodass ich diesen Code nicht kompilieren konnte ).

Ist dies möglich oder muss ich dies in mehreren Schritten tun?

Vielen Dank.

Reich
quelle

Antworten:

284

Die Erweiterungsmethoden bieten auch eine ToDictionary- Erweiterung. Es ist ziemlich einfach zu verwenden, die allgemeine Verwendung besteht darin, einen Lambda-Selektor für den Schlüssel zu übergeben und das Objekt als Wert zu erhalten, aber Sie können einen Lambda-Selektor sowohl für den Schlüssel als auch für den Wert übergeben.

class SomeObject
{
    public int ID { get; set; }
    public string Name { get; set; }
}

SomeObject[] objects = new SomeObject[]
{
    new SomeObject { ID = 1, Name = "Hello" },
    new SomeObject { ID = 2, Name = "World" }
};

Dictionary<int, string> objectDictionary = objects.ToDictionary(o => o.ID, o => o.Name);

Dann objectDictionary[1]würde der Wert "Hallo" enthalten

Quintin Robinson
quelle
44
var dictionary = (from x in y 
                  select new SomeClass
                  {
                      prop1 = value1,
                      prop2 = value2
                  }
                  ).ToDictionary(item => item.prop1);

Dies setzt voraus, dass dies für das Wörterbuch SomeClass.prop1gewünscht wird Key.

Albertein
quelle
27
.ToDictionary(item => item.prop1, item => item.prop2);um explizit den Wert auch einzustellen.
Finoutlook
42

Eine Sammlung von KeyValuePairist noch expliziter und funktioniert sehr gut.

Dictionary<int, string> dictionary = objects
    .Select(x=> new KeyValuePair<int, string>(x.Id, x.Name))
    .ToDictionary(x=>x.Key, x=>x.Value);
Antoine Meltzheim
quelle
Ist es möglich, .ToDictionary zu entfernen (x => x.Key, x => x.Value); und neues KeyValuePair durch neues Wörterbuch ersetzen?
Amir Hajiha
@ AmirNo-Familie Du liegst falsch. Wählen Sie die Methode (x => x ...), um eine Projektion für jedes Element der Objektsammlung durchzuführen . Wenn Sie also neues KeyValuePair durch ein neues Wörterbuch ersetzen, wird ein Wörterbuch mit Wörterbüchern erstellt. Ich glaube nicht, dass Sie das anstreben.
Antoine Meltzheim
Ich habe eine Liste von Dictionary <string, string> und habe versucht, select für sie zu verwenden, aber es wird ein Kompilierungsfehler ausgegeben.
Amir Hajiha