添加项目文件。
This commit is contained in:
76
MvdLiteSnoop/EntityNode.cs
Normal file
76
MvdLiteSnoop/EntityNode.cs
Normal file
@@ -0,0 +1,76 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
using MvdLiteSnoop.MvdLite;
|
||||
|
||||
|
||||
namespace MvdLiteSnoop
|
||||
{
|
||||
/// <summary>
|
||||
/// 代表实体继承树中的一个节点。
|
||||
/// </summary>
|
||||
public class EntityNode
|
||||
{
|
||||
/// <summary>
|
||||
/// 当前节点所代表的实体定义数据。
|
||||
/// </summary>
|
||||
public EntityDefinition Data { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前节点的直接子节点列表。
|
||||
/// </summary>
|
||||
public List<EntityNode> Children { get; set; }
|
||||
|
||||
public EntityNode()
|
||||
{
|
||||
Children = [];
|
||||
}
|
||||
|
||||
public override string ToString() => $"Node: {Data.Name}, Children: {Children.Count}";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 一个静态工具类,用于从实体定义列表中构建继承树。
|
||||
/// </summary>
|
||||
public static class EntityTreeBuilder
|
||||
{
|
||||
/// <summary>
|
||||
/// 根据实体定义列表中的继承关系构建一个或多个树。
|
||||
/// </summary>
|
||||
/// <param name="definitions">从MvdParser解析出的实体定义列表。</param>
|
||||
/// <returns>一个包含所有根节点(没有父类的实体)的列表。</returns>
|
||||
public static List<EntityNode> Build(List<EntityDefinition> 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<EntityNode>();
|
||||
|
||||
// 步骤 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user