2010-04-23 7 views
87

Ich weiß nicht, ob dies möglich in Linq ist aber hier geht ...Mit Linq eine Liste von Objekten in eine neue gruppierte Liste der Liste der Objekte zu gruppieren

Ich habe ein Objekt:

public class User 
{ 
    public int UserID { get; set; } 
    public string UserName { get; set; } 
    public int GroupID { get; set; } 
} 

ich eine Liste, die wie folgt aussehen:

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 in der Lage sein wollen, eine Linq-Abfrage auf der obigen Liste, die Gruppen alle Benutzer von GroupID zu laufen. Die Ausgabe wird also eine Liste von Benutzerlisten sein, die Benutzer enthalten (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 aber dies scheint eine Liste von Schlüsseln zurückzukehren und seine nicht richtig gruppiert:

var groupedCustomerList = userList.GroupBy(u => u.GroupID).ToList(); 

Jede Hilfe wäre sehr willkommen.

Dank

Antwort

194
var groupedCustomerList = userList 
    .GroupBy(u => u.GroupID) 
    .Select(grp => grp.ToList()) 
    .ToList(); 
+1

sehr schön, genau das, was ich brauchte. Danke. dies zu tun, ist der zwingende Weg saugt. – user1841243

+0

Funktioniert es gut? weil ich gebraucht werde, funktionierte das nicht. objModel.tblDonars.GroupBy (t => neu {t.CreatedOn.Year, t.CreatedOn.Month, t.CreatedOn.Day}) Wählen Sie (g => new {tblDonar = g.ToList()}). Auflisten(); das funktioniert nicht ... kannst du helfen .... –

+1

Schön es funktioniert gut. –

24

Ihre Gruppe Anweisung wird Gruppe von Gruppen-ID. Zum Beispiel, wenn Sie dann schreiben:

foreach (var group in groupedCustomerList) 
{ 
    Console.WriteLine("Group {0}", group.Key); 
    foreach (var user in group) 
    { 
     Console.WriteLine(" {0}", user.UserName); 
    } 
} 

das sollte gut funktionieren. Jede Gruppe hat einen Schlüssel, enthält aber auch eine IGrouping<TKey, TElement>, die eine Auflistung ist, die Sie über die Mitglieder der Gruppe iterieren können. Wie Lee erwähnt, können Sie jede Gruppe in eine Liste konvertieren, wenn Sie das wirklich wollen, aber wenn Sie nur wie oben beschrieben über sie iterieren, hat das keinen wirklichen Vorteil.

2

Für Typ

public class KeyValue 
{ 
    public string KeyCol { get; set; } 
    public string ValueCol { get; set; } 
} 

Sammlung

var wordList = new Model.DTO.KeyValue[] { 
    new Model.DTO.KeyValue {KeyCol="key1", ValueCol="value1" }, 
    new Model.DTO.KeyValue {KeyCol="key2", ValueCol="value1" }, 
    new Model.DTO.KeyValue {KeyCol="key3", ValueCol="value2" }, 
    new Model.DTO.KeyValue {KeyCol="key4", ValueCol="value2" }, 
    new Model.DTO.KeyValue {KeyCol="key5", ValueCol="value3" }, 
    new Model.DTO.KeyValue {KeyCol="key6", ValueCol="value4" } 
}; 

unsere Linq-Abfrage aussehen wie unten

var query =from m in wordList group m.KeyCol by m.ValueCol into g 
select new { Name = g.Key, KeyCols = g.ToList() }; 

oder für Array statt Liste wie unten

var query =from m in wordList group m.KeyCol by m.ValueCol into g 
select new { Name = g.Key, KeyCols = g.ToList().ToArray<string>() }; 
Verwandte Themen