2013-09-02 10 views
20

Ho un oggetto:utilizzando LINQ per raggruppare un elenco di oggetti

public class Customer 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int GroupID { get; set; } 
} 

ho restituire un elenco che potrebbe essere simile al seguente:

List<Customer> CustomerList = new List<Customer>(); 
CustomerList.Add(new Customer { ID = 1, Name = "One", GroupID = 1 }); 
CustomerList.Add(new Customer { ID = 2, Name = "Two", GroupID = 1 }); 
CustomerList.Add(new Customer { ID = 3, Name = "Three", GroupID = 2 }); 
CustomerList.Add(new Customer { ID = 4, Name = "Four", GroupID = 1 }); 
CustomerList.Add(new Customer { ID = 5, Name = "Five", GroupID = 3 }); 
CustomerList.Add(new Customer { ID = 6, Name = "Six", GroupID = 3 }); 

Voglio tornare una query LINQ che sarà assomigliare

CustomerList 
    GroupID =1 
    UserID = 1, UserName = "UserOne", GroupID = 1 
    UserID = 2, UserName = "UserTwo", GroupID = 1 
    UserID = 4, UserName = "UserFour", GroupID = 1 
    GroupID =2 
    UserID = 3, UserName = "UserThree", GroupID = 2 
    GroupID =3 
    UserID = 5, UserName = "UserFive", GroupID = 3 
    UserID = 6, UserName = "UserSix", 

ho provato da

Using Linq to group a list of objects into a new grouped list of list of objects

codice

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

opere ma non dà l'output desiderato.

+0

Eventuali duplicati di [utilizzando LINQ per raggruppare un elenco di oggetti in un nuovo gruppo ed elenco di lista di oggetti] (http://stackoverflow.com/questions/2697253/using-linq-to-group-a-list-of-objects-into-a-new-grouped-list-of-list- di-oggetti) – scar80

risposta

1

è questo che vuoi?

var grouped = CustomerList.GroupBy(m => m.GroupID).Select((n) => new { GroupId = n.Key, Items = n.ToList() }); 
51
var groupedCustomerList = CustomerList.GroupBy(u => u.GroupID) 
             .Select(grp =>new { GroupID =grp.Key, CustomerList = grp.ToList()}) 
             .ToList(); 
4
var groupedCustomerList = CustomerList 
         .GroupBy(u => u.GroupID, u=>{ 
                 u.Name = "User" + u.Name; 
                 return u; 
                }, (key,g)=>g.ToList()) 
         .ToList(); 

Se non si desidera modificare i dati originali, è necessario aggiungere un metodo (sorta di clone e modificare) per la classe in questo modo:

public class Customer { 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int GroupID { get; set; } 
    public Customer CloneWithNamePrepend(string prepend){ 
    return new Customer(){ 
      ID = this.ID, 
      Name = prepend + this.Name, 
      GroupID = this.GroupID 
    }; 
    } 
}  
//Then 
var groupedCustomerList = CustomerList 
         .GroupBy(u => u.GroupID, u=>u.CloneWithNamePrepend("User"), (key,g)=>g.ToList()) 
         .ToList(); 

Penso che potresti voler visualizzare il Customer in modo diverso senza modificare i dati originali. Se è così si dovrebbe disegno la classe Customer in modo diverso, in questo modo:

public class Customer { 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int GroupID { get; set; } 
    public string Prefix {get;set;} 
    public string FullName { 
    get { return Prefix + Name;} 
    }    
} 
//then to display the fullname, just get the customer.FullName; 
//You can also try adding some override of ToString() to your class 

var groupedCustomerList = CustomerList 
         .GroupBy(u => {u.Prefix="User", return u.GroupID;} , (key,g)=>g.ToList()) 
         .ToList(); 
0

Il risultato desiderato può essere ottenuto utilizzando IGrouping, che rappresenta un insieme di oggetti che hanno una chiave comune in questo caso un GroupID

var newCustomerList = CustomerList.GroupBy(u => u.GroupID) 
                .Select(group => new { GroupID = group.Key, Customers = group.ToList() }) 
                .ToList(); 
3
var groupedCustomerList = CustomerList 
.GroupBy(u => u.GroupID) 
.Select(g => new 
      { 
       GroupId = g.Key, 
       Items = g.Select(i => new 
       { 
        UserID = i.ID, 
        UserName = string.Concat("User", i.Name), 
        GroupId = i.GroupID 
       }).ToList() 
      }) 
.ToList(); 
0
var result = from cx in CustomerList 
     group cx by cx.GroupID into cxGroup 
    orderby cxGroup.Key 
    select cxGroup; 

foreach (var cxGroup in result) { 
Console.WriteLine(String.Format("GroupID = {0}", cxGroup.Key)); 
    foreach (var cx in cxGroup) { 
    Console.WriteLine(String.Format("\tUserID = {0}, UserName = {1}, GroupID = {2}", 
     new object[] { cx.ID, cx.Name, cx.GroupID })); 
    } 
}