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

C#中Linq Batch在For Each循环中无法正确分批的问题

CSV经纬度分批提交API的错误修复

核心问题

你代码里的两个关键错误导致每次提交都是全量数据:

  • 循环中错误地将helperPost.Addresses(全部200条)赋值给helperPostBatch.Addresses,而非当前迭代的batch子集
  • 遍历的集合写错了:你用了helperPost.Locations.Batch(batchCount),但你的JsonHelperPost类中并没有Locations属性,应该是helperPost.Addresses.Batch(batchCount)

修正后的主逻辑代码

var helperPost = new JsonHelperPost();
List<JsonHelperPost.Response> allRecordsPost = new List<JsonHelperPost.Response>(); // 保存所有批次的返回结果

helperPost.Addresses = JsonHelperPost.ReadCoordinateCSV(wbPath).ToList();

int batchCount = 50;

// 遍历Addresses的分批数据,修正原代码中不存在的Locations属性
foreach (var batch in helperPost.Addresses.Batch(batchCount))
{
    // 每次循环创建新的helperPostBatch实例,避免复用对象导致的状态污染
    var helperPostBatch = new JsonHelperPost();
    // 将当前批次的子集数据赋值给Addresses
    helperPostBatch.Addresses = batch.ToList();
    // 调用API并合并结果(原代码会覆盖结果,改为累加)
    var batchResult = API.ApiIHSPostRequest(helperPostBatch);
    allRecordsPost.AddRange(batchResult);
}

额外优化建议

  1. 避免同步阻塞API调用:当前用.Result处理异步请求容易导致死锁,建议改用async/await:
// 修改API方法为异步版本
public static async Task<List<JsonHelperPost.Response>> ApiIHSPostRequestAsync(JsonHelperPost helperPost)
{
    using (var client = new HttpClient())
    {
        var result = JsonConvert.SerializeObject(helperPost);
        var endpoint = new Uri("https://api.connect");
        var payload = new StringContent(result, Encoding.UTF8, "application/json");
        var byteArray = Encoding.ASCII.GetBytes("Username:password");
        client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
        
        // 用await替代.Result,避免阻塞线程
        var response = await client.PostAsync(endpoint, payload);
        response.EnsureSuccessStatusCode(); // 主动检查请求是否成功
        var apiResultPost = await response.Content.ReadAsStringAsync();

        var recordsPost = JsonConvert.DeserializeObject<List<JsonHelperPost.Response>>(apiResultPost);
        return recordsPost;
    }
}

// 主逻辑同步改为异步
public async Task ProcessAddressesAsync(string wbPath)
{
    var helperPost = new JsonHelperPost();
    List<JsonHelperPost.Response> allRecordsPost = new List<JsonHelperPost.Response>();

    helperPost.Addresses = JsonHelperPost.ReadCoordinateCSV(wbPath).ToList();

    int batchCount = 50;

    foreach (var batch in helperPost.Addresses.Batch(batchCount))
    {
        var helperPostBatch = new JsonHelperPost();
        helperPostBatch.Addresses = batch.ToList();
        var batchResult = await API.ApiIHSPostRequestAsync(helperPostBatch);
        allRecordsPost.AddRange(batchResult);
    }
}
  1. 修复序列化问题:你的Response类中address和details是字段而非属性,Json.NET默认不会序列化字段,建议改为符合C#规范的自动属性:
public class Response
{
    public Address Address { get; set; }
    public Details Details { get; set; }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:54:58