1

我知道在过去的几天里我有点痛苦,也就是说,我的所有问题,但我一直在开发这个项目,而且我(象征性地)距离完成它只有几英寸的距离。

话虽如此,我还想在另一件事上得到您的帮助。它有点与我之前的问题有关,但您不需要这些代码。问题恰恰在于这段代码。我想从你那里得到的是帮助我识别它,从而解决它。

在向您展示我一直在编写的代码之前,我想多说几句:

  1. 我的应用程序具有文件合并功能,将两个文件合并在一起并处理重复条目。
  2. 在任何给定的文件中,每一行都可以有以下四种格式之一(最后三种是可选的):Card Name|Amount, .Card Name|Amount, ..Card Name|Amount, _Card Name|Amount.
  3. 如果一行的格式不正确,程序将跳过它(完全忽略它)。

因此,基本上,示例文件可能如下所示:

Blue-Eyes White Dragon|3
..Blue-Eyes Ultimate Dragon|1
.Dragon Master Knight|1
_Kaibaman|1

现在,当谈到使用文件合并时,如果一行以特殊字符之一开头. .. _,它应该采取相应的行动。对于.,它正常运行。对于以 开头的行..,它将索引移动到第二个点,最后,它_完全忽略行(它们还有与本讨论无关的另一个用途)。

这是我的合并函数代码(出于某种奇怪的原因,第二个循环内的代码根本不会执行):

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    // Save file names to array.
    string[] fileNames = openFileDialog1.FileNames;

    // Loop through the files.
    foreach (string fileName in fileNames)
    {
        // Save all lines of the current file to an array.
        string[] lines = File.ReadAllLines(fileName);

        // Loop through the lines of the file.
        for (int i = 0; i < lines.Length; i++)
        {
            // Split current line.
            string[] split = lines[i].Split('|');

            // If the current line is badly formatted, skip to the next one.
            if (split.Length != 2)
                continue;

            string title = split[0];
            string times = split[1];

            if (lines[i].StartsWith("_"))
                continue;

            // If newFile (list used to store contents of the card resource file) contains the current line of the file that we're currently looping through...
            for (int k = 0; k < newFile.Count; k++)
            {
                if (lines[i].StartsWith(".."))
                {
                    string newTitle = lines[i].Substring(
                        lines[i].IndexOf("..") + 1);

                    if (newFile[k].Contains(newTitle))
                    {
                        // Split the line once again.
                        string[] secondSplit = newFile.ElementAt(
                            newFile.IndexOf(newFile[k])).Split('|');
                        string secondTimes = secondSplit[1];

                        // Replace the newFile element at the specified index.
                        newFile[newFile.IndexOf(newFile[k])] =
                            string.Format("{0}|{1}", newTitle, int.Parse(times) + int.Parse(secondTimes));
                    }
                    // If newFile does not contain the current line of the file we're looping through, just add it to newFile.
                    else
                        newFile.Add(string.Format(
                                        "{0}|{1}",
                                        newTitle, times));

                    continue;
                }

                if (newFile[k].Contains(title))
                {
                    string[] secondSplit = newFile.ElementAt(
                        newFile.IndexOf(newFile[k])).Split('|');
                    string secondTimes = secondSplit[1];

                    newFile[newFile.IndexOf(newFile[k])] =
                        string.Format("{0}|{1}", title, int.Parse(times) + int.Parse(secondTimes));
                }
                else
                {
                    newFile.Add(string.Format("{0}|{1}", title, times));
                }
            }
        }
    }

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

我知道这是一段相当长的代码,但我相信所有这些都与某一点相关。我跳过了一些不重要的部分(在所有这些都执行之后),因为它们完全不相关。

4

0 回答 0