C# 如何使用C迭代层次结构数据并输出层次结构#
给定以下类C# 如何使用C迭代层次结构数据并输出层次结构#,c#,.net,C#,.net,给定以下类 public class Category { public string Name {get;set;} public Category ParentCategory {get;set;} } 从类别对象集合(IList)输出以下内容的最有效方法是什么 + Parent Category ++ Sub Category ++ Sub Category 2 + Parent Category 2 ++ Sub ... ++ Sub .. ++ Sub .... 编辑:也许
public class Category {
public string Name {get;set;}
public Category ParentCategory {get;set;}
}
从类别对象集合(IList
)输出以下内容的最有效方法是什么
+ Parent Category
++ Sub Category
++ Sub Category 2
+ Parent Category 2
++ Sub ...
++ Sub ..
++ Sub ....
编辑:也许真正的问题应该是,我应该如何在数据库中表示这个模型并使用NHibernate检索它你可能想考虑扭转你们的关系。如果一个节点可以到达其父节点,但不能到达其父节点,则必须拥有所有叶节点才能打印出完整的树。将其与每个节点都知道其子节点的情况进行比较,然后只需要根节点。最近我读到了关于分层Linq查询的文章,请查看
但是我倾向于赞同Jon Skeet。一个小的递归函数可以帮你做到这一点
static void recurseCategories(ref List<Category> cl, Category start, int level)
{
foreach (Category child in cl)
{
if (child.ParentCategory == start)
{
Console.WriteLine(new String(' ', level) + child.Name);
recurseCategories(ref cl, child, level + 1);
}
}
}
static void recurseCategories(参考列表cl,类别开始,整数级别)
{
foreach(cl中的子类别)
{
if(child.ParentCategory==开始)
{
Console.WriteLine(新字符串(“”,level)+child.Name);
递归类别(参考cl,子类,级别+1);
}
}
}
我的假设是:
- 您有一个
类别的
。(当然,您要打印的所有类别对象都必须在该列表中。我认为这是不言而喻的,但似乎不是。)列表
- 根类别的父级为
。因此,初始函数调用应该是递归类别(ref myCategoryList,null,0)null
- 列表中不存在孤立元素。应该添加一些错误处理代码
- 输出顺序将与列表的迭代顺序一致,因此除了层次结构之外,它或多或少是一致的
class Program
{
static void Main(string[] args)
{
var foo = new List<Category>();
// Example structure from Question
var fail1 = new Category() { Name = "test1" };
var fail2 = new Category() { Name = "test2", ParentCategory = fail1 };
var fail3 = new Category() { Name = "test3", ParentCategory = fail1 };
var fail4 = new Category() { Name = "test4"};
var fail5 = new Category() { Name = "test5", ParentCategory = fail4 };
var fail6 = new Category() { Name = "test6", ParentCategory = fail4 };
var fail7 = new Category() { Name = "test7", ParentCategory = fail4 };
foo.Add(fail1);
foo.Add(fail4);
recurseCategories(ref foo, null, 0);
}
static void recurseCategories(ref List<Category> cl, Category start, int level)
{
foreach (Category child in cl)
{
if (child.ParentCategory == start)
{
Console.WriteLine(new String(' ', level) + child.Name);
recurseCategories(ref cl, child, level + 1);
}
}
}
public class Category
{
public string Name { get; set; }
public Category ParentCategory { get; set; }
}
}
输出应为:
test1
test 2
test 3
test 4
test 5
test 6
test 7
这是因为共享同一父节点的子节点之间没有关系。能否告诉我们您已经有哪些引用?如果您只有一个子项,我怀疑您只能输出它和它的所有父项,因为您只有一个父项引用。没有同意的子引用,不幸的是,我不确定我能用我的数据访问工具(NHibernate)做到这一点。如果可以的话,我马上就去。当我重新上网时,我会重新考虑,但那可能需要几个小时。希望到时候你会有好的答案:)你有分类间的排序吗?(我想你可以用名字…)那可能会有帮助。我不明白你在说什么。你会如何在一张桌子上存储或使用一个或另一个?@CoffeeAddict:我不确定,马上-这可能就是我没有回来编辑我的答案的原因。(请记住,这是4年前的事了……)当我写下我的原始答案时,我们不知道它应该存储在数据库中。这改变了一切。这不起作用,因为他的元素只能看到它们的父元素,但父元素看不到它的子元素。因此,澄清一下,你可以从一个子元素走到根元素,但你看不到树的任何其他分支。但这对我来说很有效。给它一个类别列表可以生成一个很好的类别树。如果列表包含所有类别-子类别和父类别,那么这个方法就可以工作。然而,如果它只包含父母,它不会-但会是什么呢?你需要另一个孩子的集合,然后这个例子的一个变体就可以了。我是这么说的。问题的作者并没有提出不同的意见。乔纳森:在我的例子中,当然所有的节点都在列表中。你为什么只加两个呢?@乔纳森:托马拉克在这里是正确的。问题说明提供了一个类别列表——它并没有说明列表只包含父类别。假设它包含所有类别,包括父类和子类,Tomalak的代码是正确的。为什么你要将一个节点结构折叠成一个数组?为什么在这一点上甚至有父引用?如果你要转换成一个数组,你最好只使用一个计数参数来确定你在层次结构中的深度并保持有序……换句话说,他(我猜你)做得不对。可能是因为它们存储在一个具有Id/ParentId结构的DB表中,而你选择它们后所拥有的只是一个节点列表?
test1
test 2
test 3
test 4
test 5
test 6
test 7