将具有父/子层次结构的通用List <T>读取到保留父/子层次结构的数据表中

如何解决将具有父/子层次结构的通用List <T>读取到保留父/子层次结构的数据表中

| 我已经用单位名称转换了这个XML树: 昏暗=尺寸
Dim1            
|---MG1     
    |---M1  
    |---M2  
    |---M3  
        |---MG31
        |---MG32


Dim2            
|---MG220       
    |---MG2222  
...成为单位列表(又称列表),其中每个单位可以具有另一个具有无限层次结构的列表。现在,我想将列表转换为具有父/子层次结构的表格格式。 这样,数据表应如下所示:
Dimension...Parent..Child
Dim1........Dim1....MG1
Dim1........MG1.....M1
Dim1........MG1.....M2
Dim1........Dim1....MG2
Dim1........MG1.....M3
Dim1........M3......MG31
Dim1........M3......MG32
Dim2........Dim2....MG220
Dim2........MG220...MG2222

public class Unit           
{           
   public String Name { get; set; }         
   public Unit Dimension { get; set; }          
   public UnitParent { get; set; }          
   public List<Unit> Children { get; set; }         

}
问题:您将如何迭代List并将所有数据写入DataTable中? 我一定找不到一个棘手的奥尔格里斯。     

解决方法

        递归在这里是正确的方法,但是我将建议使用LINQ方法-尤其是在此问题被LINQ标记的情况下。 LINQ的优点之一是扩展方法可以消除很多复杂性,并留下简单的查询来简单地表达业务逻辑。 因此,这是我用来平整递归结构的方法:
public static IEnumerable<T> Flatten<T>(this Func<T,IEnumerable<T>> @this,T root)
{
    var head = new [] { root,};
    var tail =
        from c in @this(root)
        where !c.Equals(root)
        from d in @this.Flatten(c)
        select d;
    return head.Concat(tail);
}
请注意对
Flatten
的递归调用,这是在函数上定义的扩展方法,该方法从给定的父项返回子项。 现在我们可以这样定义
Func<T,IEnumerable<T>>
Func<Unit,IEnumerable<Unit>> f = u => u.Children;
然后,假设所有
Dimension
Parent
Children
属性都不为空,我们可以使用此查询生成要添加到表中的记录列表:
var records =
    from r in dimensions
    from d in f.Flatten(r)
    select new
    {
        Dimension = d.Dimension.Name,Parent = d.Parent.Name,d.Name,};
现在,如果任何一个属性都是
null
,这里就是解决方法。 将
f
重新定义为:
Func<Unit,IEnumerable<Unit>> f = u => u.Children ?? new List<Unit>();
并添加以下扩展方法:
public static R ValueOrNull<T,R>(this T @this,Func<T,R> selector)
    where R : class
{
    return @this != null ? selector(@this) : null;
}
现在查询的工作方式如下:
var records =
    from r in dimensions
    from d in f.Flatten(r)
    select new
    {
        Dimension = d.Dimension.ValueOrNull(x => x.Name),Parent = d.Parent.ValueOrNull(x => x.Name),};
还是很相似,但是ѭ10安全。 我希望这有帮助。     ,        一个简单的递归算法会很好...
function AddSubTree(Unit unit) {
  if (unit != unit.Dimension)
    AddItemToDataTable(unit.Dimension.Name,unit.UnitParent.Name,unit.Name);
  foreach (Unit childUnit in unit.Children) {
    AddSubTree(childUnit); 
  }
}
您为每个拥有的尺寸对象调用
AddSubTree
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?