2012-02-29 17 views
7

Tengo una lista de objetos que quiero transformar en otra lista de objetos.Agrupación de objetos con expresión linq o lambda

El primer objeto se parece a esto:

private class ObjectOne 
    { 
     public string Name { get; set; } 
     public string Item{ get; set; } 
    } 

Y otro como este

public class ObjectTwo 
{ 
    public string Name { get; set; } 
    public IEnumerable<string> Items{ get; set; } 
} 

me gustaría escribir una consulta LINQ o expresión lambda que puede convertir una lista de datos ObjectOne en una lista de datos de ObjectTwo. Cada elemento en la lista de ObjectTwo contendrá un nombre distinto de ObjectOne junto con una enumeración de todos los elementos asociados con ese nombre.

Por ejemplo, la siguiente lista de datos ObjectOne

"Name One", "Item One" 
"Name One", "Item Two" 
"Name Two", "Item Three" 

produciría la siguiente lista ObjectTwo:

"Name One", {"Item One", "Item Two"} 
"Name Two", {"Item Three"} 

Respuesta

8

Use el operador GroupBy Linq. Luego, para cada agrupación, seleccione la clave (la que utilizó para agruparla) y convierta los elementos de cada grupo en una lista.

var oneList = new List<ObjectOne> 
       { 
       new ObjectOne {Name = "Name One", Item = "Item One"}, 
       new ObjectOne {Name = "Name One", Item = "Item Two"}, 
       new ObjectOne {Name = "Name Two", Item = "Item Three"} 
       }; 

var twoList= oneList.GroupBy(x => x.Name) 
        .Select (x => new ObjectTwo 
            { 
             Name = x.Key, 
             Items = x.Select(t => t.Item) 
            }); 
+1

+1 for * not * using query understanding sintaxis. Habría sido +2 si simplemente escribiera "n =>" en lugar de "one =>" :) –

+0

Saludos, código actualizado. parece que se ve mejor :) –

+0

@BryanHong, ¡gracias, funciona a la perfección! – zaq

2

se puede lograr esto mediante el operador group by LINQ:

var obj2List = 
    from o in list 
    group o by o.Name into g 
    select new ObjectTwo() {Name = g.Key, Items = g.Select(x => x.Item)}; 
Cuestiones relacionadas