迭代对象的层次结构 - C# - linq

时间:2014-12-05 05:49:38

标签: c# .net linq for-loop data-structures

我有一个对象(比如A),其层次结构如下,

  

obj A - >包含obj B的列表 - >包含obj C列表 - >   包含obj D列表

鉴于obj A,我需要得到所有obj D的列表,无论它与obj C和obj B的关联如何List<D> GetAllofD(A a)

您能否建议我完成任务的最佳方式 - 不要使用多个for loops。有没有更好的方法使用linq?

2 个答案:

答案 0 :(得分:1)

根据@ feiyun的评论,重复应用SelectMany可以逐步汇总类层次结构的所有级别:

var allDsInTheTree = new A().Bs.SelectMany(b => b.Cs.SelectMany(c => c.Ds));

给定类层次结构:

public class D { public int Id { get; set; } }
public class C {
    public IEnumerable<D> Ds { get; set; }
}
public class B
{
    public IEnumerable<C> Cs { get; set; }
}
public class A
{
    public IEnumerable<B> Bs { get; set; }
}
单个级别的

SelectMany类似于:

var cs = new List<C>();
foreach (var b in a.Bs)
{
   cs.AddRange(b.Cs);
}

答案 1 :(得分:1)

处理集合的空条件

a.b == null ? new List<D>() : a.b.SelectMany(b=>b.c==null ? new List<D>() : b.c.SelectMany(c=>c.d))