Eu não sei se isso é possível no Linq, mas aqui vai ...
Eu tenho um objeto:
public class User
{
public int UserID { get; set; }
public string UserName { get; set; }
public int GroupID { get; set; }
}
Devolvo uma lista que pode parecer com a seguinte:
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 } );
Quero poder executar uma consulta Linq na lista acima que agrupa todos os usuários por GroupID. Portanto, a saída será uma lista de listas de usuários que contêm usuários (se isso faz 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
Eu tentei usar a cláusula groupby linq, mas isso parece retornar uma lista de chaves e não está agrupada corretamente:
var groupedCustomerList = userList.GroupBy( u => u.GroupID ).ToList();
Seu grupo declaração vontade grupo, ID de grupo. Por exemplo, se você escrever:
isso deve funcionar bem. Cada grupo tem uma chave, mas também contém uma
IGrouping<TKey, TElement>
que é uma coleção que permite iterar sobre os membros do grupo. Como Lee menciona, você pode converter cada grupo em uma lista, se realmente quiser, mas se você quiser iterar sobre eles conforme o código acima, não há benefício real em fazê-lo.fonte
Para o tipo
coleção
nossa consulta linq se parece abaixo
ou para matriz em vez de lista como abaixo
fonte
Ainda era antigo, mas a resposta de Lee não me deu o grupo. Portanto, estou usando a seguinte instrução para agrupar uma lista e retornar uma lista agrupada:
Cada grupo agora tem uma chave, mas também contém um IGrouping, que é uma coleção que permite que você itere sobre os membros do grupo.
fonte
group.key
elemento ao iterar na lista agrupada, como mostrado na resposta do @JohnSkeet. Minha resposta fornecido faz fornecer o elemento group.key quando a iteração. Portanto, pode ajudar outros a cair na armadilha que as respostas fornecidas não funcionem como mostrado acima. Portanto, é apenas mais uma maneira de obter a lista com o benefício de obter o elemento group.key semelhante à resposta aceita. Não entenda sua reivindicação @GertArnold. (.net core 3.0)IGrouping
é. É por isso que o OP descarta seu próprio código correto na parte inferior, que é essencialmente idêntico ao seu código. É por isso que eles aceitam uma resposta que fornece exatamente o que pedem. O que eles precisam é de uma explicação, que JS forneceu suficientemente.