基于已有数组创建新数组的C#实现问题(禁用LINQ 4+)
双数组配对生成标识数组的实现方案
需求明确
给定两个同长度的动态数组A和B,同索引元素组成配对(如AB01 10),生成数组C需满足:
- 重复的配对对应相同的标识,标识以10为步长递增
- 首次出现的新配对分配当前递增的标识,无重复时数组C为
{10,20,30,40,50,60,70,80} - 禁用LINQ 4+
原代码问题分析
你写的嵌套循环逻辑存在两处核心错误:
- 内层循环
j从i+1开始会对每个i重复处理多次,导致arrayC被插入大量多余元素,长度远超预期 - 赋值逻辑错误,重复配对时直接用
10*(i+1),无法保证相同配对复用同一标识,新配对的赋值规则也不符合要求
正确实现思路
使用哈希字典记录已出现的配对及其对应标识,仅需一次遍历即可完成,时间复杂度O(n),逻辑清晰且高效:
- 字典的键为配对的唯一标识(可将A[i]和B[i]拼接成字符串)
- 字典的值为该配对对应的数组C标识
- 遍历过程中,若配对已存在则复用标识,不存在则分配新的递增标识并记录到字典
代码示例(C#)
// 假设arrayA和arrayB是已初始化的字符串/整数数组,长度相同 string[] arrayA = { "AB01", "AB01", "AB01", "AB02", "AB02", "AB02", "AB03", "AB01" }; int[] arrayB = { 10, 10, 20, 10, 20, 20, 40, 10 }; int[] arrayC = new int[arrayA.Length]; // 用字典存储配对-标识的映射 Dictionary<string, int> pairMap = new Dictionary<string, int>(); int currentId = 10; for (int i = 0; i < arrayA.Length; i++) { // 生成配对的唯一键,可根据实际类型调整拼接方式 string pairKey = $"{arrayA[i]}_{arrayB[i]}"; if (pairMap.ContainsKey(pairKey)) { // 配对已存在,复用标识 arrayC[i] = pairMap[pairKey]; } else { // 新配对,分配当前标识并记录到字典 arrayC[i] = currentId; pairMap.Add(pairKey, currentId); currentId += 10; } } // 输出验证:arrayC结果为 {10,10,20,30,40,40,50,10} foreach (int id in arrayC) { Console.Write(id + " "); }
代码说明
- 初始化
arrayC时直接指定长度,避免使用Insert操作导致的长度混乱 - 配对键的拼接方式可根据数组元素类型调整(比如如果是数值类型,可转为字符串后拼接)
- 每次遇到新配对时,
currentId递增10,保证标识按要求递增 - 字典的查询和插入操作都是O(1),整体效率远高于嵌套循环的O(n²)
内容的提问来源于stack exchange,提问作者sdfoijsdshoihio
相关产品推荐
相关产品推荐

