2009-03-06 14 views
138

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. L'esempio che ho imparato questo da qualcosa di usato in una forma simile al seguente:Selezionare un dizionario <T1, T2> con LINQ

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 articoli in un Dictionary<T1, T2> possono essere iterati come KeyValuePair<T1, T2> che potrei semplicemente sostituire "SomeClass" nell'esempio sopra con "new KeyValuePair<T1, T2> { ...", ma che non ha funzionato (chiave e valore sono stati contrassegnati come readonly, quindi non ho potuto compilare questo codice).

È possibile o devo farlo in più passaggi?

Grazie.

risposta

221

I metodi di estensione forniscono anche un'estensione ToDictionary. È abbastanza semplice da usare, l'uso generale sta passando un selettore lambda per la chiave e ottiene l'oggetto come valore, ma puoi passare un selettore lambda sia per la chiave che per il 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); 

Poi objectDictionary[1] conterrebbe il valore "Ciao"

+3

+1 Eh. Questo apre nuove possibilità sul modo in cui mi avvicino alla creazione di nuovi oggetti dati. – Sung

+1

Fantastico, felice che tu ne possa far uso, so che mi ha aiutato in alcune situazioni. –

+2

Egads! È ora il 2017 e ho appena scoperto questo !! –

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

Questo supponendo che SomeClass.prop1 è la Key desiderato per il dizionario.

+21

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

11

Una raccolta di KeyValuePair è ancora più esplicita e viene eseguita molto bene.

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