[英]Row grouping in a C# list
我有下面的课
public class test
{
public long missionId { get; set; }
public string[] missionAcrynom { get; set; }
public Guid userId { get; set; }
public string userName { get; set; }
public string email { get; set; }
}
和以下代码。
using (var ctx = new dbContext())
{
var userList = (from u in ctx.aspnet_Users select new {u.UserId, u.UserName}).ToList();
List<test> lst = new List<test>();
foreach (var user in userList)
{
var UserMissionList = (from m in ctx.UserMission from rpt in ctx.Report
where m.UserId == user.UserId
select new
{
m.MissionId,
m.Mission.Acronym,
m.UserId,
m.aspnet_Membership.aspnet_Users.UserName,
m.aspnet_Membership.Email
}).Distinct().ToList();
foreach (var mission in UserMissionList)
{
lst.Add(new test
{
userId = mission.UserId,
missionId = mission.MissionId,
missionAcrynom = new[] {mission.Acronym},
userName = mission.UserName,
email = mission.Email
});
}
}
}
我想要的是按用户ID将List<test> lst
列表中的值分组,但仍存储所有Mission.MissionAcrynom字符串数组中每个唯一的userId行的所有过滤行的首字母缩写值。
因此,您想为每个用户组将所有missionAcrynom
展平为更大的数组吗?
您可以使用group.SelectMany(...).ToArray()
:
List<test> groups = lst
.GroupBy(t => new { t.userId, t.userName, t.email })
.Select(g => new test
{
userId = g.Key.userId,
missionId = g.First().missionId, // take the first arbitrarily
missionAcrynom = g.SelectMany(t => t.missionAcrynom).ToArray(),
userName = g.Key.userName,
email = g.Key.email
})
.ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.