You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为MyObject批量设置ParentId:寻求无需解析Code的高效算法

高效设置ParentId的方案(避免重复解析Code字段)

场景说明

现有MyObject类定义如下:

public class MyObject
{
    public int Id { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
    // 需要新增的字段
    public int? ParentId { get; set; }
}

其中Id是主键,Code字段由空格分隔的数字串定义父子关系:子节点的Code是父节点Code末尾追加一段数字得到的。例如Code为"10 15 10"的节点,其父节点的Code是"10 15"。

现有最多10000条数据,需要为每个对象设置ParentId,要求避免重复解析Code字段导致效率低下。

解决方案

核心思路是预构建Code到Id的映射字典,仅通过字符串截取快速定位父Code,再通过字典直接获取父节点Id,全程仅需两次线性遍历,时间复杂度为O(n)。

具体步骤

  1. 构建映射字典:遍历所有数据,将每个对象的Code作为键,Id作为值存入字典,这一步仅需一次遍历。
  2. 批量设置ParentId:再次遍历每个对象,通过字符串操作获取父Code,再从字典中查询对应的父Id。

代码实现

// 假设objects是包含所有MyObject实例的集合
var codeToIdMap = new Dictionary<string, int>(objects.Count);

// 第一步:构建Code与Id的映射关系
foreach (var obj in objects)
{
    codeToIdMap[obj.Code] = obj.Id;
}

// 第二步:为每个对象设置ParentId
foreach (var obj in objects)
{
    int lastSpacePos = obj.Code.LastIndexOf(' ');
    if (lastSpacePos == -1)
    {
        // 无空格说明是根节点,ParentId设为null
        obj.ParentId = null;
    }
    else
    {
        // 截取父节点的Code
        string parentCode = obj.Code.Substring(0, lastSpacePos);
        // 从映射字典中获取父Id
        codeToIdMap.TryGetValue(parentCode, out int parentId);
        obj.ParentId = parentId;
    }
}

效率说明

  • 两次遍历均为线性操作,字典的查询操作是O(1)的哈希查找,10000条数据的处理速度极快。
  • 无需将Code解析为数组或进行循环比对,仅使用LastIndexOf和Substring两个高效字符串操作,避免了重复解析的开销。

内容的提问来源于stack exchange,提问作者Giox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 09:20:42