2013-09-02 61 views
20

tôi có một đối tượng:Sử dụng LINQ to nhóm một danh sách các đối tượng

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

Tôi trả về một danh sách đó có thể trông giống như sau:

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

Tôi muốn quay trở lại một truy vấn LINQ mà sẽ trông giống như

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

tôi đã cố gắng từ

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

đang

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

công trình nhưng không cung cấp cho các đầu ra mong muốn.

+0

có thể trùng lặp của [Sử dụng LINQ to nhóm một danh sách các đối tượng vào một nhóm mới ed danh sách các danh sách các đối tượng] (http://stackoverflow.com/questions/2697253/using-linq-to-group-a-list-of-objects-into-a-new-grouped-list-of-list- của các đối tượng) – scar80

Trả lời

1

là những gì bạn muốn?

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

Nếu bạn không muốn thay đổi dữ liệu gốc, bạn nên thêm một số phương pháp (loại bản sao và sửa đổi) để lớp học của bạn như thế này:

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

Tôi nghĩ bạn có thể muốn hiển thị Customer khác nhau mà không sửa đổi dữ liệu gốc. Nếu vậy bạn nên thiết kế lớp học của bạn Customer cách khác nhau, như thế này:

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

Các kết quả mong muốn có thể thu được bằng IGrouping, đại diện cho một tập hợp các đối tượng có một chìa khóa thông thường trong trường hợp này một 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 })); 
    } 
}