Utilizzo di Linq per raggruppare un elenco di oggetti in un nuovo elenco raggruppato di elenchi di oggetti

Non so se questo è ansible in Linq ma qui va …

Ho un object:

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

Rendo una lista che può apparire come la seguente:

 List userList = new List(); 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 } ); 

Voglio essere in grado di eseguire una query Linq nell’elenco precedente che raggruppa tutti gli utenti per GroupID. Quindi l’output sarà una lista di liste di utenti che contengono utenti (se ciò ha senso?). Qualcosa di simile a:

 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 ad usare la clausola groupq di linq ma questo sembra restituire un elenco di chiavi e non è raggruppato in modo corretto:

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

Qualsiasi aiuto sarebbe molto apprezzato.

Grazie

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

La tua dichiarazione di gruppo verrà raggruppata per ID di gruppo. Ad esempio, se poi scrivi:

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

dovrebbe funzionare bene Ogni gruppo ha una chiave, ma contiene anche un IGrouping che è una raccolta che ti permette 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.

Per tipo

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

collezione

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

la nostra query su linq appare 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() }; 

o per array invece di liste come sotto

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