C# 中替换多层级数据的 Id 和 ParentId,保持主从或父子关系不变

在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、递增数字等)即可适应不同场景。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csdn_aspnet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值