为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)。
具体步骤
- 构建映射字典:遍历所有数据,将每个对象的
Code作为键,Id作为值存入字典,这一步仅需一次遍历。 - 批量设置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
相关产品推荐
相关产品推荐

