C#“继续”未按预期运行
Posted
技术标签:
【中文标题】C#“继续”未按预期运行【英文标题】:C# 'Continue' not functioning as expected 【发布时间】:2016-09-15 14:05:52 【问题描述】:我有以下代码
private void bgwSendMail_DoWork(object sender, DoWorkEventArgs e)
DataSet ds = getMailToSend();
DataTable table = ds.Tables[0];
foreach (DataRow row in table.Rows)
string attachment1 = ds.Tables[0].Rows[0]["Attachment1"].ToString();
string attachment2 = ds.Tables[0].Rows[0]["Attachment2"].ToString();
string attachment3 = ds.Tables[0].Rows[0]["Attachment3"].ToString();
string attachment4 = ds.Tables[0].Rows[0]["Attachment4"].ToString();
string mailTo = ds.Tables[0].Rows[0]["EmailTo"].ToString();
string mailSubject = ds.Tables[0].Rows[0]["EmailSubject"].ToString();
string mailBody= ds.Tables[0].Rows[0]["EmailBody"].ToString();
string uid = ds.Tables[0].Rows[0]["uid"].ToString();
if (String.IsNullOrEmpty(attachment1))
//TODO Send Email Straight away ignore rest
else
if (!String.IsNullOrEmpty(attachment1))
bool attachment1Exists = checkFileExists(attachment1);
if (attachment1Exists == false)
continue;
现在我希望,当我们在底部点击 continue (确实会被点击)时,我们应该退出回到 foreach ,如下所示并移动到数据集中的下一条记录
这不会发生,它会一遍又一遍地迭代来自 continue 的同一记录,这是正常的吗?
如果这是正常的,那么让foreach
在数据表中退出一次后忽略该行的最佳方法是什么?
【问题讨论】:
您实际上并没有在任何地方使用row
。您一直在使用ds.Tables[0].Rows[0]
。它总是处理相同的数据是有道理的。
【参考方案1】:
continue
正在按预期工作。
您正在枚举表中的所有行,但您没有使用它。相反,您总是访问表中的第一行:
DataTable table = ds.Tables[0];
foreach(DataRow row in table.Rows)
string attachment1 = ds.Tables[0].Rows[0]["Attachment1"].ToString();
// ...
您总是在访问ds.Tables[0].Rows[0]
。
您应该使用以下代码:
foreach(DataRow row in table.Rows)
string attachment1 = row["Attachment1"].ToString();
// ...
所以你实际上是在按预期枚举表中的所有行,这不是一个无限循环,但你并没有使用表中的每一行,而是只使用第一行。
【讨论】:
多么棒的一块木板,我已经挠头好一个小时了,谢谢!【参考方案2】:改变
string attachment1 = ds.Tables[0].Rows[0]["Attachment1"].ToString();
到
string attachment1 = row["Attachment1"].ToString();
以及对 DataRow 的所有其他后续引用。
【讨论】:
以上是关于C#“继续”未按预期运行的主要内容,如果未能解决你的问题,请参考以下文章