2

背景:

1 个按钮 1 个需要写入的文件 1 个文本框 1 个 NumericUpDown

因此,在我的应用程序中,我需要写入一个包含多行的文件。输入来自一个 TextBox 和一个 NumericUpDown 控件,它包含一个通用格式的字符串string.Format("{0}|{1}", TextBoxInput, NumericUpDownInput);

我需要帮助实际上是在添加新行之前检查重复条目。基本上,如果用户决定输入他们已经拥有的东西(用更多的“时间”来更新它),程序应该检查新输入的输入是否与其中一行匹配,如果匹配,{1}则应添加部分一起并替换原始值,同时保留{0}部分。

我的方法:

我尝试解决此问题的方法是创建一个名为 string 的列表,newFilefor loop用于循环遍历,originalFile以便查找新输入是否与已输入的匹配。

然后,两种可能的情况:a)如果是,只需替换数字输入部分并将其添加到 newFile,b)如果不是,只需将其添加到 newFile。

最后,我使用了 StreamWriter 以便用 newFile 覆盖 originalFile。

不幸的是,我遇到了很多麻烦,因为无论出于何种原因,我的方法都会生成一个空白文件。如果我只使用 StreamWriter 部分而不考虑重复条目,它实际上工作得很好。

还有件事儿; 如果程序还可以首先检查文件是否存在以避免异常,那就太好了。我已经做到了,但我认为这不是最好的方法。请帮帮我。先感谢您。

下面是按钮单击事件的代码,它基本上更新/添加到文件(毕竟这是您需要的唯一代码):

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 (并且 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 回答