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.