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

基于已有数组创建新数组的C#实现问题(禁用LINQ 4+)

双数组配对生成标识数组的实现方案

需求明确

给定两个同长度的动态数组A和B,同索引元素组成配对(如AB01 10),生成数组C需满足:

  • 重复的配对对应相同的标识,标识以10为步长递增
  • 首次出现的新配对分配当前递增的标识,无重复时数组C为{10,20,30,40,50,60,70,80}
  • 禁用LINQ 4+

原代码问题分析

你写的嵌套循环逻辑存在两处核心错误:

  1. 内层循环j从i+1开始会对每个i重复处理多次,导致arrayC被插入大量多余元素,长度远超预期
  2. 赋值逻辑错误,重复配对时直接用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 + " ");
}

代码说明

  1. 初始化arrayC时直接指定长度,避免使用Insert操作导致的长度混乱
  2. 配对键的拼接方式可根据数组元素类型调整(比如如果是数值类型,可转为字符串后拼接)
  3. 每次遇到新配对时,currentId递增10,保证标识按要求递增
  4. 字典的查询和插入操作都是O(1),整体效率远高于嵌套循环的O(n²)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:45:33