sintaxis sentencias query curso c# .net linq generics

c# - sentencias - Seleccione un diccionario<T1, T2> con LINQ



linq notation c# (3)

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 Dictionary<T1, T2> y no puedo resolverlo. El ejemplo que aprendí de esto utilizó algo de forma similar a la siguiente:

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

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

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

Gracias.


Los métodos de extensiones 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 "Hello"


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


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

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