当前位置: 首页 > ops >正文

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

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

http://www.xdnf.cn/news/12594.html

相关文章:

  • Python_day47
  • burpsuite安装与入门使用
  • 【C++特殊工具与技术】优化内存分配(二):allocator类
  • excel中数字不满六位在左侧前面补0的方法
  • 数据通信与计算机网络——数字传输
  • Redis:过期删除策略与内存淘汰策略的解析指南
  • 如何处理双面沉金线路板上的定位孔?
  • 如何在Lyra Starter Game中使用EOS(Epic Online Services)
  • python将图片颜色显示在三维坐标系
  • Qt学习及使用_第1部分_认识Qt---学习目的及技术准备
  • 集运维_安装centso7.9和麒麟v10国产系统
  • Redis主从复制原理二 之 主从复制工作流程
  • C++2025.6.7 C++五级考题
  • CADisplayLink、NSTimer、GCD定时器
  • Spring AI与Spring Modulith核心技术解析
  • python打卡第45天
  • LVGL手势识别事件无上报问题处理记录
  • 【补题】Codeforces Round 715 (Div. 2) C. The Sports Festival
  • ubuntu20使用自主探索算法explore_lite实现机器人自主探索导航建图
  • 初识redis
  • H_Prj06_03 8088单板机串口读取8088ROM复位内存
  • Jetpack Compose 中,DisposableEffect、LaunchedEffect 和 sideEffect 区别和用途
  • 深入解析 CAS 操作
  • Linux 系统、代码与服务器进阶知识深度解析
  • 【Python】当前最稳定3.12版本安装,基于Anaconda的环境配置及换源
  • 力扣面试150题--除法求值
  • 计算矩阵A和B的乘积
  • 基于Python学习《Head First设计模式》第八章 模板方法模式
  • Readest(电子书阅读器) v0.9.53
  • 缓存一致性 与 执行流