1

我正在尝试使用 C# 从具有 2 列(父级、类别)的数据表创建一个层次结构,该数据表可以是 N 个节点深。

例如

Category Table
=========================
Parent     | Category
=========================
(blank)         root
root            whats-new
whats-new       hair
whats-new       skincare
skincare        face-product

从这里我试图创建以下内容:

root
root.whats-new
root.whats-new.hair
root.whats-new.skincare
root.whats-new.skincare.face-product

我查看了很多示例,但大多数都显示了 SQL 中的示例,但是我不确定应该如何处理它。

我已经能够遍历列表并建立最多 3 个深度,但是,类别可以是 N 个节点深度。任何帮助或方向将不胜感激。

4

2 回答 2

1

我最近做了一些类似的事情,不确定它是否会对您有所帮助,但您可以在此处查看代码: https ://github.com/Imdsm/PersonalWebsite/blob/master/PersonalWebsite/Views/Blog/PostArchive.cshtml

这是一个博客存档,所以年月发布。

可能最简单的方法是逐个父节点逐个遍历您的列表,例如在没有父节点的情况下按类别选择它们(好的,这就是节点一),然后获取所有具有该当前节点作为父节点的类别,好的,现在你有了第二级,然后通过它并选择所有将每个第二个节点作为其父级的节点,第三级。

代码方面,我真的无能为力,因为我不知道你是如何实现它的。

例子:

get all cats without parent
get all cats where previous cat is their parent
loop through each of these cats, get all cats where cat(n) is the parent
于 2013-03-05T09:14:28.953 回答
0

我最终以 XML 格式解析数据,而不是将其加载到数据表中。它有助于消除大量开销,同时仍然能够生成所需的层次结构,但代码要少得多。再次感谢你的帮助。

using System.Xml;

// --------------

var doc = new XmlDocument();

doc.Load(@"C:\source.xml");

XmlNodeList nodeList;
XmlNode root = doc.DocumentElement;

nodeList=root.SelectNodes("category");

Dictionary<string, string> fullName = new Dictionary<string, string>();
foreach(XmlNode node in nodeList)
{
  string nodeid = node.Attributes["category-id"].Value;
  string parent = node.Attributes["parent"].Value;
  string parentFullname = fullName[parent];
  string nodeFullname = (parentFullname != null) ? parentFullname + "." + nodeid : nodeid;
  fullName[nodeid] = nodeFullname;
}
于 2013-03-06T04:18:18.770 回答