2010-04-23 14 views
87

Non so se questo è possibile in Linq ma qui va ...utilizzando LINQ per raggruppare un elenco di oggetti in un nuovo elenco raggruppato di elenco degli oggetti

Ho un oggetto:

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

ho restituire un elenco che potrebbe essere simile al seguente:

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 }); 

io voglio essere in grado di eseguire una query LINQ sulla lista di cui sopra che raggruppa tutti gli utenti di GroupID. Quindi l'output sarà una lista di liste di utenti che contengono utenti (se ciò ha senso?). Qualcosa di simile:

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 

Ho provato con la clausola di LINQ groupby ma questo sembra restituire un elenco di chiavi e la sua non raggruppati per correttamente:

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

Qualsiasi aiuto sarebbe molto apprezzato.

Grazie

risposta

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

molto bello, proprio quello di cui avevo bisogno. grazie. facendo questo il modo imperativo fa schifo. – user1841243

+0

Funziona bene? perché sono usato in questo modo non ha funzionato. objModel.tblDonars.GroupBy (t => nuovo {t.CreatedOn.Year, t.CreatedOn.Month, t.CreatedOn.Day}). Selezionare (g => new {tblDonar = g.ToList()}). Elencare(); questo non funziona ... puoi aiutare .... –

+1

Bello il suo funzionamento soddisfacente. –

24

La tua affermazione gruppo volontà gruppo per ID gruppo. Ad esempio, se si scrive:

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

che dovrebbe funzionare correttamente. Ogni gruppo ha una chiave, ma contiene anche un IGrouping<TKey, TElement> che è una raccolta che consente di scorrere i membri del gruppo. Come menziona Lee, puoi convertire ciascun gruppo in un elenco se lo desideri, ma se hai intenzione di iterare su di essi come per il codice sopra, non c'è alcun reale vantaggio nel farlo.

2

Per il tipo

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

raccolta

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" } 
}; 

nostro sguardo query LINQ come qui di seguito

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

o per matrice invece di lista come di seguito

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