Selezionare un dizionario <T1, T2> con LINQ


171

Ho usato la parola chiave "select" e il metodo di estensione per restituire un IEnumerable<T>con LINQ, ma ho bisogno di restituire un generico Dictionary<T1, T2>e non riesco a capirlo. Nell'esempio che ho imparato da ciò ho usato qualcosa in una forma simile alla seguente:

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

Ho anche fatto la stessa cosa con i metodi di estensione. Ho assunto che dal momento che gli elementi in a Dictionary<T1, T2>possono essere ripetuti in quanto KeyValuePair<T1, T2>potrei semplicemente sostituire "SomeClass" nell'esempio sopra con " new KeyValuePair<T1, T2> { ...", ma non ha funzionato (Key e Value sono stati contrassegnati come di sola lettura, quindi non ho potuto compilare questo codice ).

È possibile o devo farlo in più passaggi?

Grazie.

Risposte:


284

I metodi delle estensioni forniscono anche un'estensione ToDictionary . È abbastanza semplice da usare, l'uso generale passa un selettore lambda per la chiave e ottiene l'oggetto come valore, ma è possibile passare un selettore lambda per chiave e valore.

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);

Quindi objectDictionary[1]conterrebbe il valore "Ciao"


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

Questo presuppone che SomeClass.prop1sia quello desiderato Keyper il dizionario.


27
.ToDictionary(item => item.prop1, item => item.prop2);per esplicitamente impostare anche il valore.
finoutlook

42

Una raccolta di KeyValuePairè ancora più esplicita ed esegue molto bene.

Dictionary<int, string> dictionary = objects
    .Select(x=> new KeyValuePair<int, string>(x.Id, x.Name))
    .ToDictionary(x=>x.Key, x=>x.Value);

È possibile rimuovere .ToDictionary (x => x.Key, x => x.Value); e sostituire il nuovo KeyValuePair con il nuovo dizionario?
Amir Hajiha,

@ AmirNo-Family Stai sbagliando. Il metodo Select (x => x ...) esegue una proiezione per ciascun elemento della raccolta di oggetti . Quindi sostituire il nuovo KeyValuePair con il nuovo dicitionary creerebbe un dizionario di dizionari. Non credo sia quello a cui stai mirando.
Antoine Meltzheim,

Ho un elenco di Dictionary <string, string> e stavo cercando di usare select su di essi ma genera un errore di compilazione.
Amir Hajiha,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.