He usado la opción «seleccionar» palabra clave y el método de extensión para devolver un IEnumerable<T> con LINQ, pero tengo necesidad de devolver un genérico Dictionary<T1, T2> y no se puede averiguar. El ejemplo de esto lo aprendí de los utilizados algo en una forma similar a la siguiente:

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, dado que los elementos de una Dictionary<T1, T2> puede ser iterado como KeyValuePair<T1, T2> que sólo podía reemplazar «SomeClass» en el ejemplo anterior con «new KeyValuePair<T1, T2> { ...«, pero que no funcionó (Clave y el Valor marcado como de sólo lectura, por lo que no pude compilar este código).

Es esto posible, o tengo que hacerlo en varios pasos?

Gracias.

InformationsquelleAutor Rich | 2009-03-06

3 Comentarios

  1. 253

    Las extensiones de los métodos también proporcionan un ToDictionary extensión. Es bastante simple de usar, el uso general es pasar un lambda selector para la clave y conseguir el objeto como el valor, pero puede pasar a un lambda selector de clave y 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);

    Luego objectDictionary[1] contendrá el valor «Hola»

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

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

    • .ToDictionary(item => item.prop1, item => item.prop2); que expresamente establezca el valor también.
  3. 26

    Una colección de KeyValuePair es aún más explícito, 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);
    • Es posible quitar .ToDictionary(x=>x.Clave, x=>x.Valor); y reemplazar la nueva KeyValuePair con nuevo Diccionario ?
    • Estás confundiendo. Seleccione(x => x …) el método de realizar una proyección para cada elemento de los objetos de la colección. Así que la sustitución de nuevo KeyValuePair con nuevos dicitionary sería crear un diccionario de diccionarios. Yo no creo que eso es lo que estamos apuntando.
    • Tengo una lista de Diccionario<string, string> y estaba tratando de utilizar seleccionar en ellos, pero se produce un error de compilación.

Dejar respuesta

Please enter your comment!
Please enter your name here