我有一个类似以下的自定义类型:
public class Parent
{
public int Id;
public List<Child1> C1;
public List<Child2> C2;
}
public class Child1
{
public int Id;
}
public class Child2
{
public int Id;
public Child3 C3;
}
public class Child3
{
public int Id;
}
我有一个Parent类的列表
List<Parent> parent = new List<Parent>();
在列表中获取“父级”的所有Id字段的最佳方法是什么?
最简单的方法是使用嵌套的foreach循环,但这是一种更清晰的方法吗?
我希望所有父对象的ID以及它们在一个List中的递归Child对象的ID
List<int> AllIds
答案 0 :(得分:2)
您可以向AllIDs
Parent
媒体资源
public IEnumerable<int> AllIDs
{
get
{
yield return Id;
foreach(var child in C1)
{
yield return child.Id;
}
foreach(var child in C2)
{
yield return child.Id;
yield return child.C3.Id;
}
}
}
现在,您可以在SelectMany
变量
parent
var ids = parent.SelectMany(p => p.AllIDs).ToList();
答案 1 :(得分:1)
您可以使用SelectMany
和Enumerable.Concat
:
List<int> allIds = parent
.SelectMany(p => new[] { p.Id } // or Enumerable.Repeat(p.Id, 1)
.Concat(p.C1.Select(c => c.Id))
.Concat(p.C2.Select(c => c.Id)))
.ToList();
如果您想要知道ID是子ID还是父ID,您可以选择包含该类型的匿名类型及其父ID(如果可用):
var allIds = parent
.SelectMany(p => new[] { new { Type="Parent", p.Id, Parent = (int?)null } }
.Concat(p.C1.Select(c => new { Type = "Child1", c.Id, Parent = (int?)p.Id }))
.Concat(p.C2.Select(c => new { Type = "Child2", c.Id, Parent = (int?)p.Id })))
.ToList();
foreach (var x in allIds)
Console.WriteLine("ID:{0} Type:{1} Parent-ID:{2}", x.Id, x.Type, x.Parent?.ToString() ?? "no parent");
答案 2 :(得分:0)
如果你想要LINQ解决方案
List<Parent> parent = new List<Parent>();
var parentIds = parent.
Select(p => p
// take C2 ids and C3 ids foreach Parent
.C2.SelectMany(c2 => new List<string> { c2.Id, c2.C3.Id} )
// Add each C1 id foreach parent
.Union(p.C1.Select(c1 => c1.Id))
// Add its own id
.Concat(new List<string> { p.id })
);
答案 3 :(得分:-1)
获取所有父ID:
List<Parent> parents = new List<Parent>();
// populate parent list
int[] parentIds = parents.Select(s => s.Id).ToArray();