2010-04-23 12 views
87

No sé si esto es posible en LINQ pero aquí va ...Usando LINQ al grupo una lista de objetos en una nueva lista agrupada de lista de objetos

que tienen un objeto:

public class User 
{ 
    public int UserID { get; set; } 
    public string UserName { get; set; } 
    public int GroupID { get; set; } 
} 

me devuelven una lista que puede ser similar al siguiente:

List<User> userList = new List<User>(); 
userList.Add(new User { UserID = 1, UserName = "UserOne", GroupID = 1 }); 
userList.Add(new User { UserID = 2, UserName = "UserTwo", GroupID = 1 }); 
userList.Add(new User { UserID = 3, UserName = "UserThree", GroupID = 2 }); 
userList.Add(new User { UserID = 4, UserName = "UserFour", GroupID = 1 }); 
userList.Add(new User { UserID = 5, UserName = "UserFive", GroupID = 3 }); 
userList.Add(new User { UserID = 6, UserName = "UserSix", GroupID = 3 }); 

Quiero ser capaz de ejecutar una consulta LINQ en la lista anterior que agrupa a todos los usuarios de GroupID. Entonces, el resultado será una lista de listas de usuarios que contiene usuarios (si tiene sentido). Algo así como:

GroupedUserList 
    UserList 
     UserID = 1, UserName = "UserOne", GroupID = 1 
     UserID = 2, UserName = "UserTwo", GroupID = 1 
     UserID = 4, UserName = "UserFour", GroupID = 1 
    UserList 
     UserID = 3, UserName = "UserThree", GroupID = 2 
    UserList 
     UserID = 5, UserName = "UserFive", GroupID = 3 
     UserID = 6, UserName = "UserSix", GroupID = 3 

He intentado usar la cláusula de LINQ GroupBy pero esto parece devolver una lista de claves y su no agrupados por correctamente:

var groupedCustomerList = userList.GroupBy(u => u.GroupID).ToList(); 

Cualquier ayuda sería muy apreciada.

Gracias

Respuesta

194
var groupedCustomerList = userList 
    .GroupBy(u => u.GroupID) 
    .Select(grp => grp.ToList()) 
    .ToList(); 
+1

muy agradable, justo lo que necesitaba. gracias. haciendo esto de la manera imperativa apesta. – user1841243

+0

¿Funciona bien? porque soy usado de esta manera no funcionó. objModel.tblDonars.GroupBy (t => new {t.CreatedOn.Year, t.CreatedOn.Month, t.CreatedOn.Day}). Seleccione (g => new {tblDonar = g.ToList()}). Listar(); esto no funciona ... ¿puedes ayudar ... –

+1

Bueno, funciona bien. –

24

Su declaración del grupo se grupo de ID de grupo. Por ejemplo, si luego escribe:

foreach (var group in groupedCustomerList) 
{ 
    Console.WriteLine("Group {0}", group.Key); 
    foreach (var user in group) 
    { 
     Console.WriteLine(" {0}", user.UserName); 
    } 
} 

que debería funcionar bien. Cada grupo tiene una clave, pero también contiene un IGrouping<TKey, TElement> que es una colección que le permite iterar sobre los miembros del grupo. Como Lee menciona, puedes convertir cada grupo en una lista si realmente quieres, pero si solo vas a iterar sobre ellos según el código anterior, no hay un beneficio real al hacerlo.

2

Para el tipo

public class KeyValue 
{ 
    public string KeyCol { get; set; } 
    public string ValueCol { get; set; } 
} 

colección

var wordList = new Model.DTO.KeyValue[] { 
    new Model.DTO.KeyValue {KeyCol="key1", ValueCol="value1" }, 
    new Model.DTO.KeyValue {KeyCol="key2", ValueCol="value1" }, 
    new Model.DTO.KeyValue {KeyCol="key3", ValueCol="value2" }, 
    new Model.DTO.KeyValue {KeyCol="key4", ValueCol="value2" }, 
    new Model.DTO.KeyValue {KeyCol="key5", ValueCol="value3" }, 
    new Model.DTO.KeyValue {KeyCol="key6", ValueCol="value4" } 
}; 

nuestra mirada consulta LINQ, como a continuación

var query =from m in wordList group m.KeyCol by m.ValueCol into g 
select new { Name = g.Key, KeyCols = g.ToList() }; 

o para la matriz en lugar de la lista, como a continuación

var query =from m in wordList group m.KeyCol by m.ValueCol into g 
select new { Name = g.Key, KeyCols = g.ToList().ToArray<string>() }; 
Cuestiones relacionadas