【问题标题】:Using LINQ to group a list of objects使用 LINQ 对对象列表进行分组
【发布时间】:2013-09-05 01:52:08
【问题描述】:

我有一个对象:

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

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

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

我想返回一个看起来像这样的 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",

我试过了

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

代码

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

有效,但没有提供所需的输出。

【问题讨论】:

标签: c# linq group-by linq-to-objects


【解决方案1】:
var groupedCustomerList = CustomerList.GroupBy(u => u.GroupID)
                                      .Select(grp =>new { GroupID =grp.Key, CustomerList = grp.ToList()})
                                      .ToList();

【讨论】:

  • 如果它帮助了你(因为它帮助了我),选择这个作为答案。
【解决方案2】:
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();

【讨论】:

    【解决方案3】:

    这是你想要的吗?

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

    【讨论】:

      【解决方案4】:
      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 })); 
        }
      }
      

      【讨论】:

        【解决方案5】:

        可以使用IGrouping 获得所需的结果,它表示具有公共键的对象集合,在这种情况下为GroupID

         var newCustomerList = CustomerList.GroupBy(u => u.GroupID)
                                                          .Select(group => new { GroupID = group.Key, Customers = group.ToList() })
                                                          .ToList();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-11
          • 2016-03-28
          • 2011-01-23
          • 1970-01-01
          相关资源
          最近更新 更多