代码之家  ›  专栏  ›  技术社区  ›  lancscoder

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

  •  107
  • lancscoder  · 技术社区  · 16 年前

    我不知道这在林肯是否可行,但这里…

    我有一个目标:

    public class User
    {
      public int UserID { get; set; }
      public string UserName { get; set; }
      public int GroupID { get; set; }
    }
    

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

    List<User> userList = new List<User>();
    userList.Add( new User { UserID = 1, UserName = "UserOne", GroupID = 1 } );
    userList.Add( new User { UserID = 2, UserName = "UserTwo", GroupID = 1 } );
    userList.Add( new User { UserID = 3, UserName = "UserThree", GroupID = 2 } );
    userList.Add( new User { UserID = 4, UserName = "UserFour", GroupID = 1 } );
    userList.Add( new User { UserID = 5, UserName = "UserFive", GroupID = 3 } );
    userList.Add( new User { UserID = 6, UserName = "UserSix", GroupID = 3 } );
    

    我希望能够在上面的列表中运行一个按groupid对所有用户分组的linq查询。因此,输出将是包含用户的用户列表列表(如果这有意义的话?).类似于:

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

    我尝试过使用groupby linq子句,但这似乎返回了一个键列表,并且它的分组方式不正确:

    var groupedCustomerList = userList.GroupBy( u => u.GroupID ).ToList();
    
    3 回复  |  直到 7 年前
        1
  •  249
  •   Lee    16 年前
    var groupedCustomerList = userList
        .GroupBy(u => u.GroupID)
        .Select(grp => grp.ToList())
        .ToList();
    
        2
  •  27
  •   P.Brian.Mackey    13 年前

    你的团体声明 按组ID分组。例如,如果随后写入:

    foreach (var group in groupedCustomerList)
    {
        Console.WriteLine("Group {0}", group.Key);
        foreach (var user in group)
        {
            Console.WriteLine("  {0}", user.UserName);
        }
    }
    

    那应该行得通。每组 一个键,但也包含 IGrouping<TKey, TElement> 它是一个集合,允许您遍历组成员。正如Lee提到的,如果你真的想,你可以将每个组转换成一个列表,但是如果你只是按照上面的代码迭代它们,那么这样做没有真正的好处。

        3
  •  2
  •   Usman Maqbool Tayyab Javed    9 年前

    对于类型

    public class KeyValue
    {
        public string KeyCol { get; set; }
        public string ValueCol { get; set; }
    }
    

    收集

    var wordList = new Model.DTO.KeyValue[] {
        new Model.DTO.KeyValue {KeyCol="key1", ValueCol="value1" },
        new Model.DTO.KeyValue {KeyCol="key2", ValueCol="value1" },
        new Model.DTO.KeyValue {KeyCol="key3", ValueCol="value2" },
        new Model.DTO.KeyValue {KeyCol="key4", ValueCol="value2" },
        new Model.DTO.KeyValue {KeyCol="key5", ValueCol="value3" },
        new Model.DTO.KeyValue {KeyCol="key6", ValueCol="value4" }
    };
    

    我们的LINQ查询如下所示

    var query =from m in wordList group m.KeyCol by m.ValueCol into g
    select new { Name = g.Key, KeyCols = g.ToList() };
    

    或者数组而不是下面的列表

    var query =from m in wordList group m.KeyCol by m.ValueCol into g
    select new { Name = g.Key, KeyCols = g.ToList().ToArray<string>() };