检索具有相同名称和类型c#的所有字段

时间:2016-05-12 14:43:30

标签: c# .net

我有一个类似以下的自定义类型:

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

4 个答案:

答案 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)

您可以使用SelectManyEnumerable.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();