对自引用父/子列表的子值求和并将父值设置为总和

Posted

技术标签:

【中文标题】对自引用父/子列表的子值求和并将父值设置为总和【英文标题】:Summing the child values of a self referencing parent/child list and setting the parents to the sum 【发布时间】:2021-12-07 18:04:27 【问题描述】:

我有一个产品实体列表,这些产品实体是自引用的,可以达到无限级别。例如:

Name: Product 1
Parent: null
Value: null

Name: Product 2
Parent: "Product 1"
Value: 20

Name: Product 3
Parent: "Product 2"
Value: null

Name: Product 4
Parent: "Product 3"
Value: 40

Name: Product 5
Parent: "Product 4"
Value: 50

Name: Product 6
Parent: null
Value: null

Name: Product 7
Parent "Product 6"
Value: 30

我正在尝试将具有空值的任何实体设置为具有该实体下的所有实体的总和(如果有任何值)。在上面的示例中,我最终会得到:

Name: Product 1
Parent: null
Value: 110

Name: Product 2
Parent: "Product 1"
Value: 20

Name: Product 3
Parent: "Product 2"
Value: 90

Name: Product 4
Parent: "Product 3"
Value: 40

Name: Product 5
Parent: "Product 4"
Value: 50

Name: Product 6
Parent: null
Value: 30

Name: Product 7
Parent "Product 6"
Value: 30

我尝试做一些预处理,将实体存储在哈希图中,但没有成功。

【问题讨论】:

您能向我们展示您标记的三种语言中的任何一种的数据吗? 看起来像 Set 来跟踪对象是否已被访问应该可以工作。 您使用的是哪种语言,请仅标记一种。如果你想要一个通用算法,请标记language-agnostic 【参考方案1】:

将这个平面层次结构转换为真正的层次结构并递归。

public class Node 
  public string Name get; set;
  public int Value get; set;
  public List<Node> Children = new List<Children>();


public int Sum(Node node) 
  int sum = 0;

  foreach(var childnode in node.Children) 
    sum+= Sum(childnode);
  
  sum+= node.Value
  return sum;


//store all nodes
var Nodes = new List<Node>();
foreach(var node in Nodes) 
  if (node.Value = 0) 
   node.Value = Sum(node);
  

【讨论】:

你要迭代两次,一次就可以完成 在foreach循环之前检查是否有超过0个子节点有什么意义?它不能防止 Children 为空。如果有 0 个孩子,foreach 循环将执行 0 次,这是完全无害的。只是为了让代码更冗长吗? 是的,很好的评论@David Conrad。 @Hazrelle 我错了,现在删除它

以上是关于对自引用父/子列表的子值求和并将父值设置为总和的主要内容,如果未能解决你的问题,请参考以下文章

突出显示 OBIEE 或 SQL 中父值的子值差异

VUE3+TS(父子兄弟组件通信)

段值相关

PostgreSQL递归查询计算父值

如何从Angular 2中的子组件事件触发父组件中的本地引用?

引用具有多个共同父项的子实体