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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:15:10