Using C# linq, How can i group by specific item in array?

leo*_*ora 2 c# linq collections group-by

I have an array of Project objects.

IEnumerable<Project> projects = GetProjects();
Run Code Online (Sandbox Code Playgroud)

Each Project has a property called "Applications" which is an array of strings.

IEnumerable<string> applicationsForProject = project.Applications();
Run Code Online (Sandbox Code Playgroud)

Some projects have 1 application (1 element in the array) but others have many.

I want to group all of my projects by individual application so I can generate a view that looks like this:

  • App 1: 10 projects
  • App 2: 4 projects
  • App 3: 5 projects

If i do this:

var projectsByApp = projects.GroupBy(r=>r.Applications);
Run Code Online (Sandbox Code Playgroud)

that will group not by the distinct applications but by the list so I wind up getting duplicate rows in my view (since project 1 might have App1 and App 2 and project 2 might just have App 2)

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

Mar*_*zek 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();
Run Code Online (Sandbox Code Playgroud)

甚至更简单的阅读:

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();
Run Code Online (Sandbox Code Playgroud)

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