【发布时间】:2015-10-14 23:23:53
【问题描述】:
我刚刚将this answer 中的代码改编为通用树构建器,并且我想出的东西可以工作,但是,我最终引入了一个元组来使其工作。我很确定它可以写得更直接,但我看不到它..
我引入元组的根本原因是因为在我迭代子节点时,我还没有将这些子节点转换为树节点。我是用我的方法创建了这个问题还是问题的内在原因我用代码解决?
这是树生成器的用法:
// USAGE
var document = DocumentModel.Load(@"Part CareAlerts Page 1 Part 1.docx", LoadOptions.DocxDefault);
var tree = BuildTree<Element, Node>(
document,
elt => elt.GetChildElements(false),
elt => new Node(elt.ElementType.ToString()) {Content = elt.Content.ToString().Trim()},
(parent, child) => parent.Children.Add(child));
// TREE BUILDER FUNCTION
public static TNode BuildTree<TIn, TNode>(TIn root, Func<TIn, IEnumerable<TIn>> childSelector,
Func<TIn, TNode> createNode, Action<TNode, TNode> connectNodes)
where TIn : class
where TNode : class
{
var stack = new Stack<Tuple<TNode, TIn>>(new[] {Tuple.Create(default(TNode), root)});
TNode tree = null;
while (stack.Any())
{
var next = stack.Pop();
var result = createNode(next.Item2);
if (tree == null)
{
tree = result;
}
if (next.Item1 != null)
{
connectNodes(next.Item1, result);
}
foreach (var child in childSelector(next.Item2).Reverse())
{
stack.Push(Tuple.Create(result, child));
}
}
return tree;
}
【问题讨论】:
-
不使用元组?创建一个类来替换元组实例并使用它...
-
为什么不创建一个类或结构来保存这两个值?
-
拥有如此高的声誉分数,我会假设您知道这不是一个适合 SO 的问题。
-
@DavidG,我的声誉意味着我已经有足够长的时间知道有一些常客在看到代码的潜在抽象性时有能力超越我......我'我不会因为冒险让他们中的一个人咬我并帮助我而感到难过。
-
郑重声明,我并不是说这是一个不好的问题,我只是建议它在这里无关紧要。这不是代码审查网站。不过,可能值得看看其他一些 SO 网站。