使用C#linq,我如何按数组中的特定项进行分组?

时间:2013-09-08 11:13:06

标签: c# linq collections group-by

我有一个Project对象数组。

IEnumerable<Project> projects = GetProjects();

每个项目都有一个名为“Applications”的属性,它是一个字符串数组。

IEnumerable<string> applicationsForProject = project.Applications();

有些项目有1个应用程序(数组中有1个元素),但其他项目有很多。

我想通过单独的应用程序对我的所有项目进行分组,这样我就可以生成如下所示的视图:

  • App 1:10个项目
  • App 2:4个项目
  • App 3:5个项目

如果我这样做:

var projectsByApp = projects.GroupBy(r=>r.Applications);

不是由不同的应用程序分组而是由列表分组,所以我最终在我的视图中获得重复的行(因为项目1可能有App1和App 2,而项目2可能只有App 2)

是否有更好的方法可以在项目数组中按不同的应用程序名称进行分组?

1 个答案:

答案 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键入为ApplicationProjectsList<Project>