C# 迁移数组指定else代码块到另一数组时误带其他行,优化Array.Clear用法
C# 精准迁移指定else代码块的实现方案
现有实现的核心问题
- 截取区间偏移:单独模糊匹配else关键字定位起始行,容易误匹配到注释、其他代码块中的else,或计算时出现索引偏移,导致额外将
st->testCount++、st->testCount = 0两行纳入截取范围。 - 清理逻辑冗余:依赖
Array.Clear将目标行置空后再遍历过滤空行,相当于先生成冗余空元素再二次清理,完全可以直接通过数组拼接移除目标区间,省略冗余步骤。
针对指定固定内容else块的优化实现
核心逻辑是通过连续多行特征匹配直接锁死目标块的起止索引,避免模糊定位的偏移问题,再通过数组前后拼接直接移除目标块,无需冗余清理。
// 从textBox2读取所有行到原数组 string[] lines1 = textBox2.Lines; int start = -1, end = -1; // 预处理每行的Trim结果,避免重复计算,兼容不同缩进差异 string[] trimmedLines = lines1.Select(l => l.Trim()).ToArray(); // 遍历定位目标块,目标块共5行,最多遍历到倒数第5行 for (int i = 0; i <= trimmedLines.Length - 5; i++) { // 匹配目标块的连续5行特征 // 若行尾有注释(如else // 处理复位逻辑),可将==改为StartsWith()兼容 if (trimmedLines[i] == "else" && trimmedLines[i+1] == "{" && trimmedLines[i+2] == "IpcRegs.IPCCLR.all = abc;" && trimmedLines[i+3] == "all = pSysInfomData->freq();" && trimmedLines[i+4] == "}") { start = i; end = i + 4; break; } } // 未匹配到目标块的异常处理 if (start == -1) { MessageBox.Show("未找到匹配的目标else代码块"); return; } // 1. 精准截取目标块生成独立数组,无多余行夹带 string[] eLines = lines1.Skip(start).Take(end - start + 1).ToArray(); // 2. 直接拼接目标块前后的行,生成剔除目标块的新数组,无空行无冗余清理 string[] lines = lines1.Take(start).Concat(lines1.Skip(end + 1)).ToArray();
通用场景扩展(匹配任意else块)
如果后续需要匹配任意与if配对的else块,无需匹配块内具体语句,可通过花括号深度计数定位闭合}的位置,避免嵌套代码块导致的闭合位置误判:
// 通用匹配else块的起止索引逻辑 for (int i = 0; i < trimmedLines.Length; i++) { // 匹配else行,兼容行尾注释 if (trimmedLines[i].StartsWith("else")) { int depth = 0; // 先处理else行本身的花括号(兼容else { 单行写法) foreach (char c in lines1[i]) { if (c == '{') depth++; if (c == '}') depth--; } // 兼容不规范的单行else写法 if (depth == 0) { start = i; end = i; break; } // 向下遍历直到花括号深度归零 int j = i + 1; while (j < lines1.Length) { foreach (char c in lines1[j]) { if (c == '{') depth++; if (c == '}') depth--; } if (depth == 0) { start = i; end = j; break; } j++; } if (start != -1) break; } }
内容的提问来源于stack exchange,提问作者Phạm Hồ Trung Thắng
相关产品推荐
相关产品推荐

