递归确定子结构
Recursively determine child structure
我创建了以下 class(简体):
public class ClassItem{
//Sub-Groups
public List<ClassItem> Children { get; set; }
public Int64 MaxChilds { get; set; }
//Properties
.........
}
现在我想通过递归的方法将每个分支中的最大Children递归到上层。为了澄清这一点,假设我有以下结构:
- ClassItem 1 (5)
- ClassItem 1.1 (1)
- ClassItem 1.1.1 (0)
- ClassItem 1.2 (0)
- ClassItem 1.3 (3)
- ClassItem 1.3.1 (0)
- ClassItem 1.3.2 (0)
- ClassItem 1.3.3 (2)
- ClassItem 1.3.3.1 (0)
- ClassItem 1.3.3.2 (0)
- ClassItem 1.4 (5)
- ClassItem 1.4.1 (0)
- ClassItem 1.4.2 (0)
- ClassItem 1.4.3 (0)
- ClassItem 1.4.4 (0)
- ClassItem 1.4.5 (0)
括号内的数字是其中的最大值;其任何分支中的子项数或其子项中的子项数。
我尝试了很多东西,但似乎无法正常运行。我现在拥有的是:
private void FindMaxChilds(ClassItem classItem, ref Int64 horizontalMaxLevels) {
//Count horizontal for each child
if (horizontalMaxLevels < classItem.Children.Count) {
horizontalMaxLevels = classItem.Children.Count;
}
foreach (ClassItem cci in classItem.Children) {
FindMaxLevels(cci, ref horizontalMaxLevels);
}
classItem.MaxChilds = horizontalMaxLevels;
}
有人可以帮我去那里吗?
我已将其拆分为 DirectChildren,以及我的 children childrens.
的输出
public static int MaxDirectChidrenPerItem(ClassItem item)
{
if (item.Children == null || item.Children.Count == 0)
{
return 0;
}
int directChildrenCount = item.Children.Count();
int descendantMaxCount = item.Children.Max(child => MaxDirectChidrenPerItem(child));
return Math.Max(directChildrenCount, descendantMaxCount);
}
使用@OrelEraki 的回答,我认为您不需要一种方法,但您可以将所有内容包装在一个 属性:
public class ClassItem
{
public List<ClassItem> Children { get; set; }
public Int64 MaxChildren
{
get
{
if (this.Children == null || this.Children.Count == 0)
{
return 0;
}
int directChildrenCount = this.Children.Count();
int descendantMaxCount = this.Children.Max(child => child.MaxChildren);
return Math.Max(directChildrenCount, descendantMaxCount);
}
}
}
我创建了以下 class(简体):
public class ClassItem{
//Sub-Groups
public List<ClassItem> Children { get; set; }
public Int64 MaxChilds { get; set; }
//Properties
.........
}
现在我想通过递归的方法将每个分支中的最大Children递归到上层。为了澄清这一点,假设我有以下结构:
- ClassItem 1 (5)
- ClassItem 1.1 (1)
- ClassItem 1.1.1 (0)
- ClassItem 1.2 (0)
- ClassItem 1.3 (3)
- ClassItem 1.3.1 (0)
- ClassItem 1.3.2 (0)
- ClassItem 1.3.3 (2)
- ClassItem 1.3.3.1 (0)
- ClassItem 1.3.3.2 (0)
- ClassItem 1.4 (5)
- ClassItem 1.4.1 (0)
- ClassItem 1.4.2 (0)
- ClassItem 1.4.3 (0)
- ClassItem 1.4.4 (0)
- ClassItem 1.4.5 (0)
括号内的数字是其中的最大值;其任何分支中的子项数或其子项中的子项数。
我尝试了很多东西,但似乎无法正常运行。我现在拥有的是:
private void FindMaxChilds(ClassItem classItem, ref Int64 horizontalMaxLevels) {
//Count horizontal for each child
if (horizontalMaxLevels < classItem.Children.Count) {
horizontalMaxLevels = classItem.Children.Count;
}
foreach (ClassItem cci in classItem.Children) {
FindMaxLevels(cci, ref horizontalMaxLevels);
}
classItem.MaxChilds = horizontalMaxLevels;
}
有人可以帮我去那里吗?
我已将其拆分为 DirectChildren,以及我的 children childrens.
的输出public static int MaxDirectChidrenPerItem(ClassItem item)
{
if (item.Children == null || item.Children.Count == 0)
{
return 0;
}
int directChildrenCount = item.Children.Count();
int descendantMaxCount = item.Children.Max(child => MaxDirectChidrenPerItem(child));
return Math.Max(directChildrenCount, descendantMaxCount);
}
使用@OrelEraki 的回答,我认为您不需要一种方法,但您可以将所有内容包装在一个 属性:
public class ClassItem
{
public List<ClassItem> Children { get; set; }
public Int64 MaxChildren
{
get
{
if (this.Children == null || this.Children.Count == 0)
{
return 0;
}
int directChildrenCount = this.Children.Count();
int descendantMaxCount = this.Children.Max(child => child.MaxChildren);
return Math.Max(directChildrenCount, descendantMaxCount);
}
}
}