2

我有一个项目对象数组。

IEnumerable<Project> projects = GetProjects();

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

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

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

我想按单个应用程序对我的所有项目进行分组,以便生成如下所示的视图:

  • 应用程序 1:10 个项目
  • 应用 2:4 个项目
  • 应用 3:5 个项目

如果我这样做:

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

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

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

4

1 回答 1

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

两个查询都返回具有两个属性的匿名类型对象列表:Applicationtyped asApplicationProjectsasList<Project>

于 2013-09-08T11:17:25.933 回答