我有一个Project对象数组。
IEnumerable<Project> projects = GetProjects();
每个项目都有一个名为“Applications”的属性,它是一个字符串数组。
IEnumerable<string> applicationsForProject = project.Applications();
有些项目有1个应用程序(数组中有1个元素),但其他项目有很多。
我想通过单独的应用程序对我的所有项目进行分组,这样我就可以生成如下所示的视图:
如果我这样做:
var projectsByApp = projects.GroupBy(r=>r.Applications);
不是由不同的应用程序分组而是由列表分组,所以我最终在我的视图中获得重复的行(因为项目1可能有App1和App 2,而项目2可能只有App 2)
是否有更好的方法可以在项目数组中按不同的应用程序名称进行分组?
答案 0 :(得分:5)
var projectsByApp = projects.SelectMany(p => p.Applications
.Select(a => new { p, a }))
.GroupBy(x => x.a)
.Select(g => new {
Application = g.Key,
Projects = g.Select(x => p).ToList())
})
.ToList();
甚至更简单易读:
var projectsByApp = (from p in projects
from a in p.Applications
group p by a into g
select new {
Application= g.Key,
Projects = g.ToList()
}).ToList();
两个查询都返回一个包含两个属性的匿名类型对象列表:Application
键入为Application
,Projects
为List<Project>