gpt4 book ai didi

c# - 如何将 hierarchyid 列表转换为二叉树

转载 作者:太空狗 更新时间:2023-10-29 23:50:23 26 4
gpt4 key购买 nike

我正在进行多层次营销(二进制),如下所示:

(但不要求二叉树是完美的,一个节点可以有0-2个子节点)

enter image description here

我的问题是我从数据库中获取的数据是平面列表。 enter image description here enter image description here

请注意我使用的是 hierarchyid (sql server 2014)

TextNode 列基本上就像一个面包屑。

每个斜杠/代表一个级别

如果我有 /1/ 的 TextNode 作为 root。那么每个以 /1/ 开头的节点都属于那个根,即 /1//1/1//1/1/1/(包含根节点,即0级)

我试过 accepted answer在这个问题上,但它不起作用。

如何将平面列表转换为二叉树,以便我可以轻松遍历并将其显示在屏幕上?

如果重要的话,我会使用 C#、ASP MVC 5、SQL Server 2014。

最佳答案

我根据 Alex 的实现准确地实现了这段代码,但正如在某些情况下提到的那样,它无法正常工作..看看我的图像和我的代码(从 Alex 的帖子中复制)[数据库中的数据是正确的但在 TreeView 中似乎有些问题]

public class Row : IRow<string>
{
public string TextNode { get; }
public string Value { get; }
public long Id { get; }
public string FIN { get; }
public Row(string textNode, string userName, long id, string fin)
{
FIN = fin;
Id = id;
TextNode = textNode;
Value = userName;
}
}

public interface IRow<out T>
{
string TextNode { get; }
long Id { get; }
string FIN { get; }
T Value { get; }
}

public class TreeNode<T>
{
private struct NodeDescriptor
{
public int Level { get; }
public int ParentIndex { get; }

public NodeDescriptor(IRow<T> row)
{
var split = row.TextNode.Split(new[] { "/" }, StringSplitOptions.RemoveEmptyEntries);
Level = split.Length;
ParentIndex = split.Length > 1 ? int.Parse(split[split.Length - 2]) - 1 : 0;
}
}
public T title { get; }
public long Id { get; }
public string FIN { get; }
public List<TreeNode<T>> children { get; }

private TreeNode(T value, long id, string fin)
{
Id = id;
FIN = fin;
title = value;
children = new List<TreeNode<T>>();
}

public static TreeNode<T> Parse(IReadOnlyList<IRow<T>> rows)
{
if (rows.Count == 0)
return null;
var result = new TreeNode<T>(rows[0].Value, rows[0].Id, rows[0].FIN);
FillParents(new[] { result }, rows, 1, 1);
return result;
}

private static void FillParents(IList<TreeNode<T>> parents, IReadOnlyList<IRow<T>> rows, int index, int currentLevel)
{
var result = new List<TreeNode<T>>();
for (int i = index; i < rows.Count; i++)
{
var descriptor = new NodeDescriptor(rows[i]);
if (descriptor.Level != currentLevel)
{
FillParents(result, rows, i, descriptor.Level);
return;
}
var treeNode = new TreeNode<T>(rows[i].Value, rows[i].Id, rows[i].FIN);
parents[descriptor.ParentIndex].children.Add(treeNode);
result.Add(treeNode);
}
}
}

enter image description here

enter image description here

这也是我的 JSON 输出以获取更多信息:

{"title":"Earth","Id":32,"FIN":"FIN","children":[{"title":"Europe","Id":33,"FIN":"FIN001","children":[{"title":"France","Id":35,"FIN":"FIN001001","children":[{"title":"Paris","Id":36,"FIN":"FIN001001001","children":[]},{"title":"Brasilia","Id":41,"FIN":"FIN002001001","children":[]},{"title":"Bahia","Id":42,"FIN":"FIN002001002","children":[]}]},{"title":"Spain","Id":38,"FIN":"FIN001002","children":[{"title":"Madrid","Id":37,"FIN":"FIN001002001","children":[{"title":"Salvador","Id":43,"FIN":"FIN002001002001","children":[]}]}]},{"title":"Italy","Id":45,"FIN":"FIN001003","children":[]},{"title":"Germany","Id":48,"FIN":"FIN001004","children":[]},{"title":"test","Id":10049,"FIN":"FIN001005","children":[]}]},{"title":"South America","Id":34,"FIN":"FIN002","children":[{"title":"Brazil","Id":40,"FIN":"FIN002001","children":[{"title":"Morano","Id":47,"FIN":"FIN001003001","children":[]}]}]},{"title":"Antarctica","Id":39,"FIN":"FIN003","children":[{"title":"McMurdo Station","Id":44,"FIN":"FIN003001","children":[]}]}]}

关于c# - 如何将 hierarchyid 列表转换为二叉树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32044123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com