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

我不知道这在 Linq 是否可行,但是..。

我有个目标:

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

我希望能够在上面的列表中运行一个 Linq 查询,它按 GroupID 对所有用户进行分组。所以输出将是一个包含 user 的用户列表列表(如果有意义的话?).比如:

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();
419421 次浏览
var groupedCustomerList = userList
.GroupBy(u => u.GroupID)
.Select(grp => grp.ToList())
.ToList();

您的组语句 威尔按组 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 提到的,如果您真的想要的话,您可以将每个组转换成一个列表,但是如果您只是按照上面的代码对它们进行迭代,那么这样做没有什么实际的好处。

打字用的

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

还是一个老问题,但是李的回答没有给我小组。结果是钥匙。因此,我使用以下语句对一个列表进行分组并返回一个分组列表:

public IOrderedEnumerable<IGrouping<string, User>> groupedCustomerList;


groupedCustomerList =
from User in userList
group User by User.GroupID into newGroup
orderby newGroup.Key
select newGroup;

每个组现在都有一个键,但是也包含一个 IGrouping,它是一个集合,允许您在组的成员之间进行迭代。

现在您可以使用 Linq 的 FindAll ()

var groupedCustomerList = userList.FindAll( u => u.GroupID);