using System.Collections.Generic;
using System.Linq;
using MvdLiteSnoop.MvdLite;
namespace MvdLiteSnoop
{
///
/// 代表实体继承树中的一个节点。
///
public class EntityNode
{
///
/// 当前节点所代表的实体定义数据。
///
public EntityDefinition Data { get; set; }
///
/// 当前节点的直接子节点列表。
///
public List Children { get; set; }
public EntityNode()
{
Children = [];
}
public override string ToString() => $"Node: {Data.Name}, Children: {Children.Count}";
}
///
/// 一个静态工具类,用于从实体定义列表中构建继承树。
///
public static class EntityTreeBuilder
{
///
/// 根据实体定义列表中的继承关系构建一个或多个树。
///
/// 从MvdParser解析出的实体定义列表。
/// 一个包含所有根节点(没有父类的实体)的列表。
public static List Build(List definitions)
{
if (definitions == null || !definitions.Any())
{
return [];
}
// 步骤 1: 创建一个名称到节点的映射,方便快速查找父节点。
var nodeMap = definitions.ToDictionary(
def => def.Name, // Key 是实体名称
def => new EntityNode { Data = def } // Value 是新创建的节点
);
var rootNodes = new List();
// 步骤 2: 遍历所有节点,将它们连接到各自的父节点上。
foreach (var node in nodeMap.Values)
{
// 检查实体是否有父类,并且该父类存在于我们的映射中。
if (!string.IsNullOrEmpty(node.Data.InheritsFrom) && nodeMap.TryGetValue(node.Data.InheritsFrom, out EntityNode parentNode))
{
// 如果找到了父节点,则将当前节点加到父节点的子集列表中。
parentNode.Children.Add(node);
}
else
{
// 如果没有父类或找不到父类,则认为它是一个根节点。
rootNodes.Add(node);
}
}
return rootNodes;
}
}
}