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); }
额外优化建议
- 避免同步阻塞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); } }
- 修复序列化问题:你的
Response类中address和details是字段而非属性,Json.NET默认不会序列化字段,建议改为符合C#规范的自动属性:
public class Response { public Address Address { get; set; } public Details Details { get; set; } }
内容的提问来源于stack exchange,提问作者CGarden
相关产品推荐
相关产品推荐

