2009-03-06 17 views
138

He utilizado la palabra clave "seleccionar" y el método de extensión para devolver un IEnumerable<T> con LINQ, pero tengo la necesidad de devolver un Dictionary<T1, T2> genérico y no puedo encontrarlo. El ejemplo lo aprendí de algo usado en una forma similar a la siguiente:Seleccione un diccionario <T1, T2> con LINQ

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

También he hecho lo mismo con los métodos de extensión. Supuse que como los ítems en un Dictionary<T1, T2> pueden iterarse como KeyValuePair<T1, T2>, podría reemplazar "SomeClass" en el ejemplo anterior por "new KeyValuePair<T1, T2> { ...", pero eso no funcionó (Key y Value fueron marcados como de solo lectura, así que no pude compilar este código).

¿Es esto posible, o tengo que hacer esto en varios pasos?

Gracias.

Respuesta

221

Los métodos de extensión también proporcionan una extensión ToDictionary. Es bastante simple de usar, el uso general es pasar un selector lambda para la clave y obtener el objeto como el valor, pero puede pasar un selector lambda para la clave y el valor.

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

Entonces objectDictionary[1] contendría el valor "Hola"

+3

+1 Whuh. Esto abre nuevas posibilidades en la forma en que abordo la creación de nuevos objetos de datos. – Sung

+1

Impresionante, me alegro de que te saques provecho, sé que me ha ayudado en algunas situaciones. –

+2

¡Egads! ¡Ahora es 2017 y acabo de enterarme de esto! –

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

Eso suponiendo que SomeClass.prop1 es el Key deseada para el diccionario.

+21

'.ToDictionary (item => item.prop1, item => item.prop2);' explicity también establece el valor. – finoutlook

11

Una colección de KeyValuePair es aún más explícita y se ejecuta muy bien.

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