提问人:NiclasNilsson 提问时间:9/24/2023 最后编辑:NiclasNilsson 更新时间:9/24/2023 访问量:86
Foreach 循环,直到 i == x
Foreach loop until i == x
问:
我想在> x 后立即运行 foreach 循环 我在foreach之前尝试过i while loop Do 循环 但是,即使我相等,foreach 仍然运行 我不知道我应该如何运行它
我需要它运行 9999 次,然后做一些事情,然后从下一个 9999 开始,依此类推
我已经更新了整个代码 我需要在数据表中实现当时批处理大小为 9999 的所有行,然后运行 restsharp,然后转到下一个 9999
当数据表中的所有行都完成后,我需要转到sql查询并运行下一个查询,然后是新的数据表和相同的batchsize 9999
请帮忙
这是我的代码
protected void run_Click1(object sender, ImageClickEventArgs e)
{
var body = "";
string[] evenNums = new string[3];
evenNums[0] = "2";
evenNums[1] = "3";
evenNums[2] = "4";
var daytime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss", CultureInfo.GetCultureInfo("sv-SE"));
var day = DateTime.Now.ToString("yyyyMMdd", CultureInfo.GetCultureInfo("sv-SE"));
foreach (string Site in evenNums)
{
body = "{\"requestId\": \"144x25\",\"items\": [";
using (SqlConnection con = new SqlConnection())
{
string conn_str = ConfigurationManager.ConnectionStrings["SqlConnection1"].ConnectionString;
SqlConnection conn = new SqlConnection(conn_str);
string query = "SELECT [number],[surname],[forename],[emailAddress],[taxIdentifier] FROM[Customer] WITH(NOLOCK) WHERE[CustomerID] IN(SELECT[CustomerID] FROM[Visit] WITH(NOLOCK) WHERE[GamingDate] Between convert(Date, DATEADD(DAY, -365, GETDATE())) AND convert(Date, getdate())) AND(EmailAddress IS NOT NULL) AND(ContactTypes & 1 = 1) AND(HomePropertyID = " + Site + ") /* 2= Malmö 3=Göteborg 4=Stockholm */ AND(LEN(TaxIdentifier) = '12')";
SqlCommand comm = new SqlCommand(query, conn);
conn.Open();
comm.ExecuteNonQuery();
DataTable dt1 = new DataTable();
using (SqlDataAdapter adapter = new SqlDataAdapter(comm))
{
adapter.Fill(dt1);
}
string newFileName = "C:\\temp\\" + ort + "" + day + "FromNeon_Cleaned.csv";
string clientHeader = "number" + "," + "\"surname\"" + "," + "\"forename\"" + "," + "\"repsonseId\"" + "," + "\"responseTime\"" + Environment.NewLine;
File.WriteAllText(newFileName, clientHeader);
int batchSize = 2;
bool willBreak = false;
for (int i = 0; i < batchSize; i++)
{
for (int j = 0; j < dt1.Rows.Count; j++)
{
DataRow dtRow = dt1.Rows[j];
if (i == j)
{
break; // in there what you want as I understand
willBreak = true;
}
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 + "\"},";
}
body = body.Remove(body.Length - 1);
body += "]}";
}
if (willBreak) break;
}
var url = "https://marketing.spelpaus.se/api/marketing-subjectid/mw41yZpBFC";
var client = new RestClient(url);
var request = new RestRequest(url, Method.Post);
request.AddHeader("authorization", "vGrpkoNEWHpMuQVrIKVGfsfx2l7SLbsSfQ7PbISjMyiK545ezHW5BzsfPgJq0HA6");
request.AddHeader("Content-Type", "application/json");
//var bodyy = JsonConvert.SerializeObject(body);
request.AddBody(body, "application/json");
RestResponse response = client.Execute(request);
if (response.StatusCode == HttpStatusCode.OK)
{
var obj = JsonConvert.DeserializeObject<dynamic>(response.Content);
var alloweditemsdata = (obj.allowedItemIds);
var responseId = (obj.responseId);
//var responseId1= Convert.ToInt32(responseId.value);
dt1.PrimaryKey = new DataColumn[] { dt1.Columns["number"] };
foreach (int alloweditem in alloweditemsdata)
{
DataRow Drw = dt1.Rows.Find(alloweditem);
var numberresult = Drw.ItemArray[0];
var surnameresult = Drw.ItemArray[1];
var forenameresult = Drw.ItemArray[2];
var emailAddressresult = Drw.ItemArray[3];
string taxidentifierresult = (string)Drw.ItemArray[4];
string clientDetails = " " + numberresult + ",\"" + surnameresult + "\",\"" + forenameresult + "\",\"" + emailAddressresult + "\",\"" + responseId + "\",\"" + daytime + "\"" + Environment.NewLine;
File.AppendAllText(newFileName, clientDetails, Encoding.Unicode);
}
}
}
}
}
答:
0赞
groophy lifefor
9/24/2023
#1
如果我们更喜欢 for 循环而不是 while 循环,我们可以更好地理解我们处于多少个循环中,所以我用 for 循环重写了你的代码,如果 i == x 为 true,我用 break 结束了整个循环。
int batchSize = 2;
bool willBreak = false;
for (int i = 0; i < batchSize; i++)
{
for (int j = 0; j < dt1.Rows.Count; j++)
{
DataRow dtRow = dt1.Rows[j];
if (i == j) {
break; // in there what you want as I understand
willBreak=true;
}
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 + "\"},";
}
body = body.Remove(body.Length - 1);
body += "]}";
}
if (willBreak) break;
}
评论
1赞
gunr2171
9/24/2023
虽然这段代码可以解决这个问题,但包括解释它如何以及为什么解决这个问题将真正有助于提高你的帖子的质量。请记住,您是在为将来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释,并指出适用的限制和假设。
0赞
NiclasNilsson
9/24/2023
如果我像你分享的代码一样中断,我会回来获取下一个 2 个吗?在 willBreak = True 上出现错误;检测到无法访问的代码
2赞
Peter B
9/24/2023
#2
您有 2 个嵌套的 for 循环,外部的 with 循环变量和内部的 with 循环变量。但是你实际上没有任何地方使用 i
,除了做 .i
j
break
结果如下:
- 当 j==0 时,内部 -loop 首先立即中断,因为 的值为 0。
j
i
- 由于外部 -loop,内部 -loop 重新启动,现在它在 j==1 时中断,因为现在 的值是 1。
j
i
i
- 它再次重新启动,现在它在 j==2 时中断。
- 等。
- 等。
- 直到最后 -loop 结束,因为它已经达到了值。
i
batchsize
这真的很奇怪,看起来像是一个错误。我怀疑你根本不需要 -loop,所以我建议你删除它,而是在 -loop 中执行类似 if (j == batchsize) { break; }
的事情。i
j
评论
0赞
NiclasNilsson
9/24/2023
Peter B,这是我从这个论坛提出的建议,我尝试了一下,但忘记了我在编辑帖子之前更改了代码
0赞
NiclasNilsson
9/24/2023
Peter B,您如何推荐循环,以便根据需要进行,谢谢
0赞
NiclasNilsson
9/25/2023
我现在有这一步可以工作了。但是在我运行 batchsize 之后,它会中断并运行以下步骤,但之后我转到顶部,SQL 问题,但我需要它运行下一个 batchsize,直到它完成 DataTable 中的所有行,任何关于我如何做到这一点的想法
0赞
Peter B
9/25/2023
如果在进行更改后出现不同/新问题,最好创建一个新问题。
评论
if (i != j) { code goes here }
var evenNums = new string[3] { "2", "4", "6" };
HomePropertyID