这是设置:
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:另外,我想只遍历主列表一次......;)
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)