c# - operaciones - Usar Linq para agrupar una lista de objetos en una nueva lista agrupada de lista de objetos
linq select group by (3)
La declaración de su grupo se agrupará por 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);
}
}
eso 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.
No sé si esto es posible en Linq, pero aquí va ...
Tengo un objeto:
public class User
{
public int UserID { get; set; }
public string UserName { get; set; }
public int GroupID { get; set; }
}
Devuelvo una lista que puede parecerse a la 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 poder ejecutar una consulta de Linq en la lista anterior que agrupa a todos los usuarios por GroupID. Entonces, el resultado será una lista de listas de usuarios que contiene usuarios (si tiene sentido). Algo 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
Intenté utilizar la cláusula groupby linq pero parece que devuelve una lista de claves y no está agrupada correctamente:
var groupedCustomerList = userList.GroupBy( u => u.GroupID ).ToList();
Cualquier ayuda sería muy apreciada.
Gracias
Por 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 consulta linq se ve 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 array en lugar de list 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>() };
var groupedCustomerList = userList
.GroupBy(u => u.GroupID)
.Select(grp => grp.ToList())
.ToList();