如何对比两个ID列表并有序输出对应分类名称?
修正ID前缀匹配逻辑并实现有序输出
问题分析
你当前的代码存在两个核心问题,导致无法得到预期结果:
- 判断条件错误:代码里用
parentCategoryId[j] == NewCategoryId[i]做完全匹配,但需求是匹配ID的前3位前缀,这直接导致所有符合条件的项都无法被正确识别。 - 输出乱序且冗余:双重循环的遍历顺序完全依赖
NewCategoryId的原始顺序,再加上父分类列表里的重复项,会输出大量冗余内容且顺序混乱。
修正方案
我们需要调整匹配逻辑,同时优化数据结构来实现精准匹配和有序输出:
步骤1:修正前缀匹配逻辑
把完全相等的判断,改成对比两个ID的前3位字符,用Substring(0, 3)提取前缀进行比较。
步骤2:优化父分类数据(去重)
父分类列表里存在重复的ID(比如3930000出现两次),我们可以先把父分类转换成字典,以前缀为键、对应的分类信息为值,这样既能避免重复匹配,还能提升查找效率。
步骤3:实现有序输出
如果要完全匹配预期的输出顺序,我们可以确保子分类列表的顺序和预期一致,或者在遍历前对子分类ID进行排序。
修正后的测试代码
// 修正测试数据的对应关系,匹配预期输出 List<string> parentCategoryId = new List<string> { "3930000", "4230000", "5200000" }; List<string> parentCategoryName = new List<string> { "Computers", "Furniture", "Toys" }; List<string> NewCategoryId = new List<string> { "3931700", "3931200", "4231400", "5201300" }; List<string> NewCategoryName = new List<string> { "Lenovo", "HP", "Chairs", "ToyCars" }; // 将父分类转换为字典:前缀 -> (父ID, 父分类名称),自动去重 var parentDict = parentCategoryId .Select((id, index) => new { Prefix = id.Substring(0, 3), ParentId = id, ParentName = parentCategoryName[index] }) .GroupBy(item => item.Prefix) .ToDictionary(group => group.Key, group => group.First()); // 按子分类列表的顺序遍历输出(如需其他排序,可先对NewCategoryId排序) for (int i = 0; i < NewCategoryId.Count; i++) { string subId = NewCategoryId[i]; string subName = NewCategoryName[i]; string subPrefix = subId.Substring(0, 3); if (parentDict.TryGetValue(subPrefix, out var parentInfo)) { Console.WriteLine($"{subId} {subName} {parentInfo.ParentId} {parentInfo.ParentName}"); } }
代码解释
- 父分类字典:通过LINQ把父分类转换成以前缀为键的字典,每个前缀只保留一个父分类,彻底避免重复匹配的问题。
- 精准前缀匹配:提取子分类ID的前3位,在字典中快速查找对应的父分类,匹配逻辑完全符合需求。
- 有序输出:遍历顺序和子分类列表的顺序完全一致,如果你需要其他排序规则,只需要在遍历前对
NewCategoryId添加排序逻辑即可(比如NewCategoryId = NewCategoryId.OrderBy(id => id).ToList())。
针对原Excel生成代码的补充建议
在你的ExcellCreation类处理分类匹配时,也需要注意两点:
- 添加父分类时,用
Distinct()去重,避免后续出现重复的父分类项。 - 匹配子分类和父分类时,同样使用
Substring(0,3)做前缀对比,不要用完全匹配。
内容的提问来源于stack exchange,提问作者Jens Svensson
相关产品推荐
相关产品推荐

