C#列表中的行分组
我有下面的班级C#列表中的行分组,c#,c#-4.0,C#,C# 4.0,我有下面的班级 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; } } 和下面的代码 usi
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
});
}
}
}
使用(var ctx=new dbContext())
{
var userList=(从ctx.aspnet_用户中的u选择新的{u.UserId,u.UserName});
List lst=新列表();
foreach(userList中的var用户)
{
var UserMissionList=(来自ctx.UserMission中的m,来自ctx.Report中的rpt
其中m.UserId==user.UserId
选择新的
{
m、 任务ID,
m、 使命,缩写,
m、 用户ID,
m、 aspnet_Membership.aspnet_Users.UserName,
m、 aspnet_Membership.Email
}).Distinct().ToList();
foreach(UserMissionList中的var任务)
{
添加(新测试)
{
userId=mission.userId,
missionId=mission.missionId,
missionAcrynom=new[]{mission.Acronym},
用户名=mission.userName,
email=mission.email
});
}
}
}
我想要的是将我的
列表lst
列表中的值按用户ID分组,但仍然存储所有任务。missionAcrynom字符串数组中每个唯一用户ID行的所有筛选行的首字母缩写值。那么您想要将所有missionAcrynom
扁平化为每个用户组的更大数组吗
您可以使用组。选择many(…).ToArray()
:
列表组=lst
.GroupBy(t=>new{t.userId,t.userName,t.email})
.选择(g=>新测试
{
userId=g.Key.userId,
missionId=g.First().missionId,//任意取第一个
missionAcrynom=g.SelectMany(t=>t.missionAcrynom).ToArray(),
userName=g.Key.userName,
email=g.Key.email
})
.ToList();
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();