2

バックグラウンド:

1 つのボタン 1 つの TextBox に書き込む必要のある 1 つのファイル 1 つの NumericUpDown

したがって、私のアプリケーションでは、いくつかの行を含むファイルに書き込む必要があります。入力は TextBox および NumericUpDown コントロールから取得され、一般的な形式の文字列で構成されますstring.Format("{0}|{1}", TextBoxInput, NumericUpDownInput);

私が助けを必要としているのは、新しい行を追加する前に重複するエントリを実際にチェックすることです。基本的に、ユーザーがすでに持っているものを入力することを決定した場合 (より多くの「回数」で更新するため)、プログラムは新しく入力された入力が行の 1 つと一致するかどうかを確認し、一致する場合はその{1}部分を追加する必要があります。パーツを維持したまま、元の値を置き換えます{0}

私のアプローチ:

私がこれにアプローチしようとした方法は、新しい入力が既に入力されたものと一致するかどうかを確認するために、呼び出されnewFileた型と使用された型の文字列のリストを作成しfor loopてループすることです。originalFile

次に、2 つのケースが考えられます。a) 含まれている場合は、数値入力部分を置き換えて newFile に追加します。b) 含まれていない場合は、newFile に追加します。

最後に、StreamWriter を使用して、originalFile を newFile で上書きします。

残念ながら、私のアプローチでは何らかの理由で空のファイルが生成されるため、かなりの問題があります。重複するエントリを考慮せずに StreamWriter 部分だけを使用した場合、実際には問題なく動作します。

ああ、もう 1 つ。例外を回避するために、プログラムが最初にファイルが存在するかどうかもチェックできると便利です。私はこれを管理しましたが、それが最善の方法だとは思いません。お願い助けて。前もって感謝します。

以下は、基本的にファイルを更新/追加するボタン クリック イベントのコードです (結局のところ、必要なコードはこれだけです)。

private void btnAdd_Click(object sender, EventArgs e)
        {
            // If input is either blank or invalid [-] (the input is verified through a database), show error message.
        if (cardTitle == "" || cardTitle == "-")
            MessageBox.Show("Correct any errors before trying to add a card to your Resources.", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);

            // If the file does not exist, create it and close the stream object so as to further use the file.
        if (!File.Exists("CardResources.ygodc"))
            using (File.Create("CardResources.ygodc")) { };

            string[] originalFile = File.ReadAllLines("CardResources.ygodc");
            List<string> newFile = new List<string>();

            for (int count = 0; count < originalFile.Length; count++)
            {
                string[] split = originalFile[count].Split('|');
                string title = split[0];
                string times = split[1];

                if (title == cardTitle)
                    newFile[count].Replace(string.Format("{0}|{1}", title, times), string.Format("{0}|{1}", title, (nudTimes.Value + int.Parse(times)).ToString()));
                else
                    newFile.Add(string.Format("{0}|{1}", cardTitle, nudTimes.Value.ToString()));
            }

            using (StreamWriter sw = new StreamWriter("CardResources.ygodc", true))
            {
                foreach (string line in newFile)
                {
                    sw.WriteLine(line);
                }
            }
        }

PS:私は英語のネイティブ スピーカーではありません。

編集:cardTitleの略か疑問に思っている場合は、基本的には TextBox からの入力です。

編集2:私のアプローチの主な間違いは、newFileリストを編集するだけでなく、空のリストから始めるという事実だと思いますoriginalFile。あれについてどう思う?

4

1 に答える 1

0

常に文字列を newFile に ADD します (また、String.Format は型を文字列表現に変換する点で非常に優れているため、 で ToString を呼び出す必要はありませんint)。追加するのではなく、完全なファイルをディスクに書き戻します。

List<string> newFile = new List<string>();
bool isMatched = false;
if (File.Exists("CardResources.ygodc"))
{  
    string[] originalFile = File.ReadAllLines("CardResources.ygodc");

    for (int count = 0; count < originalFile.Length; count++)
    {
        string[] split = originalFile[count].Split('|');
        string title = split[0];
        string times = split[1];
        if (title == cardTitle)
        {
            newFile.Add(string.Format(
                           "{0}|{1}",
                           title, nudTimes.Value + int.Parse(times)));
            isMatched =true;
        }
        else
            newFile.Add(string.Format(
                            "{0}|{1}", 
                            title, times));
     }

}
if (!isMatched)
{
    newFile.Add(string.Format(
                           "{0}|{1}", 
                            cardTitle, nudTimes.Value));
}

using (StreamWriter sw = new StreamWriter("CardResources.ygodc"))
{
     foreach (string line in newFile)
     {
         sw.WriteLine(line);
     }
}

入力と出力のサンプル:

   Input    |  Output
card| Value | 
----------------------
A   | 1     |  A|1

   Input    |  Output
card| Value | 
----------------------
B   | 1     |  A|1
            |  B|1

   Input    |  Output
card| Value | 
----------------------
C   | 1     |  A|1
            |  B|1
            |  C|1

   Input    |  Output
card| Value | 
----------------------
A   | 2     |  A|3
            |  B|1
            |  C|1
于 2013-09-07T14:24:40.390 に答える