使用LINQ对对象列表进行分组

我有一个对象:

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

我返回一个可能如下所示的列表:

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

我想返回一个看起来像的linq查询

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

我试过了

使用Linq将对象列表分组到对象列表的新分组列表中

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

有效但不能提供所需的输出。

 var groupedCustomerList = CustomerList.GroupBy(u => u.GroupID) .Select(grp =>new { GroupID =grp.Key, CustomerList = grp.ToList()}) .ToList(); 
 var groupedCustomerList = CustomerList .GroupBy(u => u.GroupID, u=>{ u.Name = "User" + u.Name; return u; }, (key,g)=>g.ToList()) .ToList(); 

如果您不想更改原始数据,则应该向您的类添加一些方法(克隆和修改类型),如下所示:

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

我想您可能希望以不同方式显示 Customer而不修改原始数据。 如果是这样,您应该以不同的方式设计您的类Customer ,如下所示

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

这是你想要的吗?

 var grouped = CustomerList.GroupBy(m => m.GroupID).Select((n) => new { GroupId = n.Key, Items = n.ToList() }); 

可以使用IGrouping获得期望的结果, IGrouping表示具有公共密钥的对象的集合,在这种情况下具有GroupID

  var newCustomerList = CustomerList.GroupBy(u => u.GroupID) .Select(group => new { GroupID = group.Key, Customers = group.ToList() }) .ToList(); 
 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 })); } }