在C#中替换多层级数据的Id和ParentId,同时保持父子关系不变,可以通过以下步骤实现:
创建旧Id到新Id的映射:遍历所有节点,为每个旧Id生成唯一的新Id,并存储在字典中。
替换节点的Id和ParentId:使用映射表更新每个节点的Id,并将ParentId替换为对应的新Id。
示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
public class Node
{
public int Id { get; set; }
public int? ParentId { get; set; }
// 其他属性...
}
public class Program
{
public static void Main()
{
List<Node> nodes = GetSampleNodes();
// 创建旧Id到新Id的映射
Dictionary<int, int> idMap = new Dictionary<int, int>();
int newId = 100; // 新Id起始值
foreach (var node in nodes)
{
idMap[node.Id] = newId++;
}
// 替换Id和ParentId
foreach (var node in nodes)
{
node.Id = idMap[node.Id];
if (node.ParentId.HasValue)
{
node.ParentId = idMap[node.ParentId.Value];
}
}
// 输出结果验证
foreach (var node in nodes)
{
Console.WriteLine($"Id: {node.Id}, ParentId: {node.ParentId}");
}
}
private static List<Node> GetSampleNodes()
{
return new List<Node>
{
new Node { Id = 1, ParentId = null },
new Node { Id = 2, ParentId = 1 },
new Node { Id = 3, ParentId = 1 },
new Node { Id = 4, ParentId = 2 },
new Node { Id = 5, ParentId = 4 }
};
}
}
关键点说明:
1、映射表生成:使用字典记录旧Id与新Id的对应关系,确保新Id唯一。
2、替换顺序:先生成所有新Id后再进行替换,避免依赖顺序问题。
3、处理根节点:ParentId为null时无需处理,保持其不变。
输出示例:
Id: 100, ParentId:
Id: 101, ParentId: 100
Id: 102, ParentId: 100
Id: 103, ParentId: 101
Id: 104, ParentId: 103
此方法保证原有的层级结构不变,仅替换Id值。根据需求调整新Id生成方式(如Guid、递增数字等)即可适应不同场景。
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。