Ich weiß nicht, ob dies in Linq möglich ist, aber hier geht es weiter ...
Ich habe ein Objekt:
public class User
{
public int UserID { get; set; }
public string UserName { get; set; }
public int GroupID { get; set; }
}
Ich gebe eine Liste zurück, die wie folgt aussehen könnte:
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 } );
Ich möchte in der obigen Liste eine Linq-Abfrage ausführen können, die alle Benutzer nach GroupID gruppiert. Die Ausgabe ist also eine Liste von Benutzerlisten, die Benutzer enthält (wenn das sinnvoll ist?). Etwas wie:
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
Ich habe versucht, die groupby linq-Klausel zu verwenden, aber dies scheint eine Liste von Schlüsseln zurückzugeben, die nicht korrekt gruppiert ist:
var groupedCustomerList = userList.GroupBy( u => u.GroupID ).ToList();
Ihre Gruppenanweisung wird nach Gruppen-ID gruppiert. Zum Beispiel, wenn Sie dann schreiben:
das sollte gut funktionieren. Jede Gruppe hat einen Schlüssel, enthält aber auch einen, bei
IGrouping<TKey, TElement>
dem es sich um eine Sammlung handelt, mit der Sie die Mitglieder der Gruppe durchlaufen können. Wie Lee erwähnt, können Sie jede Gruppe in eine Liste konvertieren, wenn Sie dies wirklich möchten. Wenn Sie sie jedoch nur gemäß dem obigen Code durchlaufen möchten, hat dies keinen wirklichen Vorteil.quelle
Für Typ
Sammlung
Unsere Linq-Abfrage sieht wie folgt aus
oder für Array anstelle von Liste wie unten
quelle
Immer noch eine alte, aber die Antwort von Lee gab mir nicht die Gruppe. Schlüssel als Ergebnis. Daher verwende ich die folgende Anweisung, um eine Liste zu gruppieren und eine gruppierte Liste zurückzugeben:
Jede Gruppe hat jetzt einen Schlüssel, enthält aber auch eine IGrouping, eine Sammlung, mit der Sie über die Mitglieder der Gruppe iterieren können.
quelle
group.key
wie in der Antwort von @JohnSkeet gezeigt. Meine bereitgestellte Antwort enthält das Element group.key beim Iterieren. Es könnte also anderen helfen, in die Falle zu tappen, dass die bereitgestellten Antworten nicht wie oben gezeigt funktionieren. Es ist also nur eine andere Möglichkeit, die Liste mit dem Vorteil abzurufen, dass das group.key-Element ähnlich der akzeptierten Antwort abgerufen wird. Verstehe deinen Anspruch @GertArnold nicht. (.net Core 3.0)IGrouping
ist. Aus diesem Grund verwerfen OP unten ihren eigenen korrekten Code, der im Wesentlichen mit Ihrem Code identisch ist . Deshalb akzeptieren sie eine Antwort, die genau das liefert, wonach sie fragen. Was sie brauchen, ist eine Erklärung, die JS ausreichend zur Verfügung gestellt hat.