Nie wiem, czy jest to możliwe w Linq, ale oto idzie ...
Mam obiekt:
public class User
{
public int UserID { get; set; }
public string UserName { get; set; }
public int GroupID { get; set; }
}
Zwracam listę, która może wyglądać następująco:
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 } );
Chcę mieć możliwość uruchomienia zapytania Linq na powyższej liście, która grupuje wszystkich użytkowników według GroupID. Zatem wynikiem będzie lista list użytkowników, która zawiera użytkownika (jeśli ma to sens?). Coś jak:
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
Próbowałem użyć klauzuli groupby linq, ale wydaje się, że zwraca listę kluczy i nie jest ona poprawnie pogrupowana:
var groupedCustomerList = userList.GroupBy( u => u.GroupID ).ToList();
Twój wyciąg grupowy zostanie pogrupowany według identyfikatora grupy. Na przykład, jeśli napiszesz:
to powinno działać dobrze. Każda grupa ma klucz, ale zawiera również
IGrouping<TKey, TElement>
kolekcję, która umożliwia iterację po członkach grupy. Jak wspomina Lee, możesz przekonwertować każdą grupę na listę, jeśli naprawdę chcesz, ale jeśli zamierzasz je po prostu iterować zgodnie z powyższym kodem, nie ma to żadnych korzyści.źródło
Do typu
kolekcja
nasze zapytanie linq wygląda jak poniżej
lub dla tablicy zamiast listy, jak poniżej
źródło
Wciąż stara, ale odpowiedź Lee nie podała mi grupy. W rezultacie klucz. Dlatego używam następującej instrukcji, aby pogrupować listę i zwrócić zgrupowaną listę:
Każda grupa ma teraz klucz, ale zawiera także IGrouping, czyli zbiór, który pozwala na iterację po członkach grupy.
źródło
group.key
elementu podczas iteracji po zgrupowanej liście, jak pokazano w odpowiedzi @JohnSkeet. Podana przeze mnie odpowiedź zawiera element group.key podczas iteracji. Więc może pomóc innym wpaść w pułapkę, że podane odpowiedzi nie działają tak, jak pokazano powyżej. Jest to więc tylko kolejny sposób na uzyskanie listy z korzyścią uzyskania elementu group.key podobnego do zaakceptowanej odpowiedzi. Nie rozumiem swojego roszczenia @GertArnold. (.net core 3.0)IGrouping
jest. Dlatego OP odrzuca swój własny poprawny kod na dole, który jest zasadniczo identyczny z twoim kodem. Dlatego akceptują odpowiedź, która zawiera dokładnie to, o co proszą. Potrzebują wyjaśnienia, które JS dostarczył w wystarczający sposób.