【问题标题】:iterating through the hierarchy of objects - C# - linq遍历对象的层次结构 - C# - linq
【发布时间】:2014-12-05 05:49:38
【问题描述】:

我有一个对象(比如 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 有更好的方法吗?

【问题讨论】:

  • a.b.SelectMany(b=>b.c.SelectMany(c=>c.d))
  • a.b.c.Select(c=>c.d).ToList();
  • @feiyun0112:谢谢,它工作正常。有没有办法在同一个 linq 查询中处理集合的 null 条件?

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


【解决方案1】:

处理集合的空条件

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

【讨论】:

    【解决方案2】:

    根据@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);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-23
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多