Je ne sais pas si cela est possible à Linq mais voilà ...
J'ai un objet:
public class User
{
public int UserID { get; set; }
public string UserName { get; set; }
public int GroupID { get; set; }
}
Je renvoie une liste qui peut ressembler à ceci:
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 } );
Je veux pouvoir exécuter une requête Linq sur la liste ci-dessus qui regroupe tous les utilisateurs par GroupID. Ainsi, la sortie sera une liste de listes d'utilisateurs contenant l'utilisateur (si cela a du sens?). Quelque chose comme:
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
J'ai essayé d'utiliser la clause groupby linq mais cela semble renvoyer une liste de clés et elle n'est pas regroupée correctement:
var groupedCustomerList = userList.GroupBy( u => u.GroupID ).ToList();
Votre déclaration de groupe sera regroupée par ID de groupe. Par exemple, si vous écrivez ensuite:
cela devrait fonctionner correctement. Chaque groupe a une clé, mais contient également un
IGrouping<TKey, TElement>
qui est une collection qui vous permet d'itérer sur les membres du groupe. Comme Lee le mentionne, vous pouvez convertir chaque groupe en une liste si vous le souhaitez vraiment, mais si vous allez simplement les parcourir selon le code ci-dessus, il n'y a aucun avantage réel à le faire.la source
Pour le type
collection
notre requête linq ressemble à ci-dessous
ou pour tableau au lieu de liste comme ci-dessous
la source
Encore un ancien, mais la réponse de Lee ne m'a pas donné le groupe. Clé en conséquence. Par conséquent, j'utilise l'instruction suivante pour grouper une liste et renvoyer une liste groupée:
Chaque groupe a maintenant une clé, mais contient également un IGrouping qui est une collection qui vous permet d'itérer sur les membres du groupe.
la source
group.key
élément lors de l'itération dans la liste groupée comme indiqué dans la réponse de @JohnSkeet. Ma réponse fournie ne fournir l'élément group.key lorsque itérer. Cela pourrait donc aider d'autres à tomber dans le piège que les réponses fournies ne fonctionnent pas comme indiqué ci-dessus. C'est donc juste une autre façon d'obtenir la liste avec l'avantage d'obtenir l'élément group.key similaire à la réponse acceptée. Ne comprenez pas votre réclamation @GertArnold. (.net core 3.0)IGrouping
c'est. C'est pourquoi OP supprime son propre code correct en bas, qui est essentiellement identique à votre code. C'est pourquoi ils acceptent une réponse qui fournit exactement ce qu'ils demandent. Ce dont ils ont besoin, c'est d'une explication, que JS a suffisamment fournie.