我正在尝试将一个值转换为另一个值。我正在使用 streamreader/writer 导入一个文本文件。我想知道我是否可以让 if 语句中的 while 循环部分等到循环的其余部分完成后再编写它应该做的事情。我知道这可能是一个简单的问题,但出于某种原因我可以指出来。我没有使用多线程处理并且想远离异步。
using (StreamReader reader = new StreamReader(convertInput))
{
string line;
writer.WriteLine(formatter, "Original Value", "Converted Value");
writer.WriteLine(formatter, "--------------", "---------------");
A: while ((line = reader.ReadLine()) != null)
{
string str2BeConverted = line;
long numHexToDex;
if ((Int64.TryParse(line, NumberStyles.HexNumber, null, out numHexToDec)) == false)
{
writer.WriteLine();
writer.Write(line + " " + "is not a Hexadecimal value.");
goto A;
}
Int64.TryParse(line, NumberStyles.HexNumber, null, out numHexToDec);
string lineChanged = numHexToDec.ToString("G");
}
}
我想等到所有解析成功的值都写完了,然后把没有解析的值写到最后。
最佳答案
最简单的方法是将它们写入某种缓冲区,例如 StringBuilder,然后在处理完所有成功的元素后将 StringBuilder 的内容写出:
using (StreamReader reader = new StreamReader(convertInput))
{
string line;
Stringbuilder builder = new StringBuilder();
writer.WriteLine(formatter, "Original Value", "Converted Value");
writer.WriteLine(formatter, "--------------", "---------------");
while ((line = reader.ReadLine()) != null)
{
string str2BeConverted = line;
long numHexToDex;
if ((Int64.TryParse(line, NumberStyles.HexNumber, null, out numHexToDec)) == false)
{
builder.AppendLine();
builder.Append(line + " " + "is not a Hexadecimal value.");
continue; //there is ALWAYS an alternative to goto
}
Int64.TryParse(line, NumberStyles.HexNumber, null, out numHexToDec);
string lineChanged = numHexToDec.ToString("G");
}
writer.Write(builder.ToString();
}
此外,正如许多评论所述,使用 goto
的代码绝不是好的代码。总有一些你可以做的更正确的事情,在这种情况下它非常简单(continue
关键字将绕过循环 block 的其余部分,重新评估 while 条件,并进一步迭代如果有说明)。
关于C# 等待 while 循环的一部分完成以执行另一个操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11835299/