2013-09-02 20 views
20

mam obiektu:Używanie LINQ do grupy listę obiektów

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

wrócę listę, która może wyglądać następująco:

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

chcę wrócić kwerendy LINQ, które będą wyglądać

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", 

próbowałem z

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

kod

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

działa ale nie daje pożądany wynik.

+0

Możliwy duplikat [LINQ do grupy listę obiektów do nowej grupy ed lista przedmiotów] (http://stackoverflow.com/questions/2697253/using-linq-to-group-a-list-of-objects-into-a-new-grouped-list-of-list- obiektów) – scar80

Odpowiedz

1

czy tego chcesz?

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

Jeśli nie chcesz zmieniać oryginalne dane, należy dodać metodę (rodzaj klonu i modyfikacji) do klasy tak:

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

Myślę, że możesz chcieć wyświetlać inaczej niż bez modyfikowania oryginalnych danych. Jeśli tak powinieneś projekt klasa Customer inaczej, tak:

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

Pożądany efekt można uzyskać stosując IGrouping, która stanowi zbiór obiektów, które mają wspólny klucz w tym przypadku 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 })); 
    } 
}