使用Linq和C#,尝试从两个内部列表分组的主项目列表中获取两个列表

Sté*_*écy 6 c# linq

这是设置:

public class Parent
{
    public List<Child> ChildrenA = new List<Child>();
    public List<Child> ChildrenB = new List<Child>();
}

public class Child
{
    public Child (string name) {Name=name;}
    public string Name {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

拥有以下数据:

var parents = new List<Parent>();
parents.Add (new Parent());
parents[0].ChildrenA.Add (new Child("A1"));
parents[0].ChildrenA.Add (new Child("A2"));
parents[0].ChildrenB.Add (new Child("B1"));
parents.Add (new Parent());
parents[1].ChildrenA.Add (new Child("A3"));
Run Code Online (Sandbox Code Playgroud)

现在我想在一个linq语句中得到以下结果:

var result = ... // would be an anonymous type

Assert.That (result.ChildrenA.Count, Is.EqualTo(3));
Assert.That (result.ChildrenA[0].Name, Is.EqualTo("A1"));
Assert.That (result.ChildrenA[1].Name, Is.EqualTo("A2"));
Assert.That (result.ChildrenA[2].Name, Is.EqualTo("A3"));

Assert.That (result.ChildrenB.Count, Is.EqualTo(1));
Assert.That (result.ChildrenB[0].Name, Is.EqualTo("B1"));
Run Code Online (Sandbox Code Playgroud)

我尝试使用selectmany加入分组,我似乎无法找到正确的方法.

任何Linq奇才?

PS:另外,我想只遍历主列表一次......;)

dtb*_*dtb 3

var result = parents.Aggregate(
                     new
                     {
                         ChildrenA = Enumerable.Empty<Child>(),
                         ChildrenB = Enumerable.Empty<Child>()
                     },
                     (a, p) => new
                               {
                                   ChildrenA = a.ChildrenA.Concat(p.ChildrenA),
                                   ChildrenB = a.ChildrenB.Concat(p.ChildrenB)
                               });
Run Code Online (Sandbox Code Playgroud)

这基本上相当于:

var result = new
             {
                 ChildrenA = Enumerable.Empty<Child>()
                                       .Concat(parents[0].ChildrenA)
                                       .Concat(parents[1].ChildrenA)
                                       .Concat(parents[2].ChildrenA)
                                       ...,

                 ChildrenB = Enumerable.Empty<Child>()
                                       .Concat(parents[0].ChildrenB)
                                       .Concat(parents[1].ChildrenB)
                                       .Concat(parents[2].ChildrenB)
                                       ...
             };
Run Code Online (Sandbox Code Playgroud)

使用 POFL(普通的旧 foreach 循环)可能更有效:

var childrenA = new List<Child>();
var childrenB = new List<Child>();

foreach (var parent in parents)
{
    childrenA.AddRange(parent.ChildrenA);
    childrenB.AddRange(parent.ChildrenB);
}

var result = new
             {
                 ChildrenA = childrenA,
                 ChildrenB = childrenB
             };
Run Code Online (Sandbox Code Playgroud)