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. Por lo tanto, la salida será una lista de listas de usuarios que contiene un usuario (si eso 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é usar 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();
Su declaración de grupo se agrupará por ID de grupo. Por ejemplo, si luego escribe:
Eso debería funcionar bien. Cada grupo tiene una clave, pero también contiene una
IGrouping<TKey, TElement>
que es una colección que le permite iterar sobre los miembros del grupo. Como menciona Lee, puede convertir cada grupo en una lista si realmente lo desea, pero si solo va a iterar sobre ellos según el código anterior, no hay ningún beneficio real al hacerlo.fuente
Por tipo
colección
nuestra consulta linq se ve a continuación
o para la matriz en lugar de la lista como a continuación
fuente
Todavía es viejo, pero la respuesta de Lee no me dio el grupo. Clave como resultado. Por lo tanto, estoy usando la siguiente declaración para agrupar una lista y devolver una lista agrupada:
Cada grupo ahora tiene una clave, pero también contiene un IGrouping que es una colección que le permite iterar sobre los miembros del grupo.
fuente
group.key
elemento al iterar a través de la lista agrupada como se muestra en la respuesta de @JohnSkeet. Mi respuesta siempre hace proporcionar el elemento group.key cuando se repite. Por lo tanto, podría ayudar a otros caer en la trampa que las respuestas proporcionadas no funcionen como se muestra arriba. Por lo tanto, es solo otra forma de obtener la lista con el beneficio de obtener el elemento group.key similar a la respuesta aceptada. No entienda su reclamo @GertArnold. (.net core 3.0)IGrouping
es. Es por eso que OP descarta su propio código correcto en la parte inferior, que es esencialmente idéntico a su código. Es por eso que aceptan una respuesta que proporciona exactamente lo que piden. Lo que necesitan es una explicación, que JS proporcionó suficientemente.