如何解决将具有父/子层次结构的通用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 举报,一经查实,本站将立刻删除。