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

lan*_*der 127 c# linq

我不知道Linq是否可行,但这里有......

我有一个对象:

public class User
{
  public int UserID { get; set; }
  public string UserName { get; set; }
  public int GroupID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

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 } );
Run Code Online (Sandbox Code Playgroud)

我希望能够在上面的列表上运行Linq查询,该查询按GroupID对所有用户进行分组.因此输出将是包含用户的用户列表列表(如果这有意义?).就像是:

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
Run Code Online (Sandbox Code Playgroud)

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

var groupedCustomerList = userList.GroupBy( u => u.GroupID ).ToList();
Run Code Online (Sandbox Code Playgroud)

Lee*_*Lee 279

var groupedCustomerList = userList
    .GroupBy(u => u.GroupID)
    .Select(grp => grp.ToList())
    .ToList();
Run Code Online (Sandbox Code Playgroud)

  • 非常好,正是我需要的。谢谢你。这样做势在必行的方式很糟糕。 (2认同)
  • 它工作正常吗?因为我习惯了这种方式不起作用。objModel.tblDonars.GroupBy(t =&gt; new { t.CreatedOn.Year, t.CreatedOn.Month, t.CreatedOn.Day }).Select(g =&gt; new { tblDonar = g.ToList() }).ToList( ); 这不起作用……你能帮忙吗…… (2认同)
  • 目前,如果您尝试将代码转换为以前的列表类型,该代码不起作用并会导致错误。因为在 select 中返回一个列表会在列表中创建一个列表,这不是此处所需的输出。对于那些有问题的人,我可以建议: var groupedCustomerList = userList.GroupBy(u =&gt; u.GroupID).Select(grp =&gt; grp.First()).ToList(); (2认同)

Jon*_*eet 36

您的组声明将按组ID分组.例如,如果你然后写:

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

应该工作正常.每个组都有一个键,但也包含IGrouping<TKey, TElement>一个集合,允许您迭代组的成员.正如李提到的那样,如果你真的想要,你可以将每个组转换成一个列表,但是如果你只是按照上面的代码迭代它们,那么这样做没有任何实际好处.


小智 5

适用类型

public class KeyValue
{
    public string KeyCol { get; set; }
    public string ValueCol { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

收藏

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" }
};
Run Code Online (Sandbox Code Playgroud)

我们的 linq 查询如下所示

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

或用于数组而不是如下所示的列表

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