C#嵌套循环如何避免重复结果,实现同URL的REQUEST与RESPONSE配对
问题根因
你当前的双层循环是全量遍历所有元素对,当i对应某url的REQUEST、z对应同url的RESPONSE时会添加一次配对;当i遍历到该url的RESPONSE、z遍历到同url的REQUEST时,会再次触发匹配条件,添加反向顺序的配对,最终就出现了每组重复两次的结果。
解决方案
方案1:修改原有嵌套循环逻辑
仅以REQUEST类型的条目作为配对起点,避免反向匹配产生的重复:
List<string> finalSorted = new List<string>(); for (int i = 0;i < arrFinal.Count; i++) { string[] line = arrFinal[i].Split(";"); // 非REQUEST类型直接跳过,不做配对发起方 if (line[1] != "REQUEST") { continue; } for (int z = 0; z < arrFinal.Count; z++) { string[] zLine = arrFinal[z].Split(";"); if (line[5] == zLine[5] && zLine[1] == "RESPONSE") { finalSorted.Add(arrFinal[i]); finalSorted.Add(arrFinal[z]); // 若同url只会有一组请求响应,匹配到后可直接跳出内层循环提升性能 break; } } }
方案2:更高效的分组实现(时间复杂度O(n),适合数据量较大的场景)
用LINQ按url字段分组,每组内直接匹配REQUEST和RESPONSE,避免嵌套循环的高额性能开销:
List<string> finalSorted = arrFinal // 提前做一次拆分缓存,避免重复Split字符串 .Select(rawStr => new { RawContent = rawStr, Segments = rawStr.Split(';') }) // 按url(索引为5的字段)分组 .GroupBy(item => item.Segments[5]) .SelectMany(group => { var request = group.FirstOrDefault(item => item.Segments[1] == "REQUEST"); var response = group.FirstOrDefault(item => item.Segments[1] == "RESPONSE"); var groupResult = new List<string>(); // 仅同时存在请求和响应时才返回配对结果 if (request != null) groupResult.Add(request.RawContent); if (response != null) groupResult.Add(response.RawContent); return groupResult; }) .ToList();
优化建议
- 如果业务场景中存在同一个url对应多组请求响应的情况,可以新增请求唯一标识(比如请求ID)作为匹配维度,避免配对错误
- 数据量较大时优先使用分组方案,嵌套循环的O(n²)时间复杂度在数据量过万后性能会非常差
内容的提问来源于stack exchange,提问作者An3SC
相关产品推荐
相关产品推荐

