1

ある値を別の値に変換しようとしています。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");
    }
}

正常に解析されたすべての値が書き込まれるまで待ってから、最後に書き込まれなかった値を書き込みたいと思います。

4

1 に答える 1

4

最も簡単な方法は、これらを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キーワードは、ループブロックの残りの部分をバイパスし、while条件を再評価し、必要に応じてさらに反復します)。

于 2012-08-06T20:24:30.027 に答える