如何实现while循环条件在每次foreach执行后都被校验?
问题描述
当数值i小于等于batchSize时执行循环处理数据行,目前在foreach前设置了while循环,但该while仅在开始时判断一次就进入foreach遍历所有行,无法中途校验i <= batchSize的条件。当前尝试的代码如下:
While (i <= batchSize) { foreach (DataRow dtRow in dt1.Rows) { var number = dtRow.ItemArray[0]; var surname = dtRow.ItemArray[1]; var forename = dtRow.ItemArray[2]; var emailAddress = dtRow.ItemArray[3]; string taxidentifier = (string)dtRow.ItemArray[4]; //string taxidentifier = "2211221143"; if (Personnummer.Valid(taxidentifier)) { body += "{\"itemId\": \"" + number + "\",\"subjectId\": \"" + taxidentifier + "\"},"; batch = i++; } } }
解决方案
问题核心是外层while仅在循环启动时做一次条件判断,进入foreach后会强制遍历所有数据行,中途不会再检查i的状态。要实现实时校验条件,需要手动控制行的遍历流程,把条件判断嵌入每一次行处理的逻辑中:
// 获取数据行的迭代器,手动控制遍历 using (var rowEnumerator = dt1.Rows.GetEnumerator()) { // 同时校验两个条件:是否还能继续处理(i <= batchSize)、是否还有未处理的行 while (i <= batchSize && rowEnumerator.MoveNext()) { DataRow dtRow = (DataRow)rowEnumerator.Current; var number = dtRow.ItemArray[0]; var surname = dtRow.ItemArray[1]; var forename = dtRow.ItemArray[2]; var emailAddress = dtRow.ItemArray[3]; string taxidentifier = (string)dtRow.ItemArray[4]; //string taxidentifier = "2211221143"; if (Personnummer.Valid(taxidentifier)) { body += "{\"itemId\": \"" + number + "\",\"subjectId\": \"" + taxidentifier + "\"},"; batch = i++; // 每次自增i后立即校验,超出batchSize就终止循环 if (i > batchSize) { break; } } } }
补充优化建议
字符串累加拼接JSON容易引发性能问题,建议改用StringBuilder优化:
StringBuilder bodyBuilder = new StringBuilder(); // ... if (Personnummer.Valid(taxidentifier)) { bodyBuilder.AppendFormat("{{\"itemId\": \"{0}\",\"subjectId\": \"{1}\"}},", number, taxidentifier); batch = i++; if (i > batchSize) break; } // 最后移除末尾多余的逗号 string body = bodyBuilder.ToString().TrimEnd(',');
内容的提问来源于stack exchange,提问作者NiclasNilsson
相关产品推荐
相关产品推荐

