C# 一次读取 3 个文件,搜索字符串并显示结果

本文关键字:字符 搜索 字符串 串并 结果 显示 文件 一次 读取 | 更新日期: 2023-09-27 18:35:28

我正在开发一个程序,该程序将一次打开 3 个文件,搜索字符串(游戏名称),然后在列表框中显示结果,其中包含 3 个文件中的信息。

到目前为止,我有这个

    string gamesData;
    string salesData;
    string compData;
    string textBox;
    StreamReader gamesFile, salesFile, compFile;
    gamesFile = File.OpenText("game.dat");
    salesFile = File.OpenText("SalesNumbers.dat");
    compFile = File.OpenText("company.dat");
    textBox = searchTxtBox.Text;

   while (!gamesFile.EndOfStream)
   {
        if (searchTxtBox.Text != "")
        {
            if(searchTxtBox.Text.Trim() == gamesData)
            {
                string.Compare(textBox, gamesData);
                gamesData = gamesFile.ReadLine();
                salesData = salesFile.ReadLine();
                compData = compFile.ReadLine();
                listBoxGames.Items.Add(gamesData +"====" + salesData + "====" + compData);
            }
            else 
                if (microRb.Checked)
                  {                           
                compData = "ms";
                  }
            else
                if (eaRb.Checked)
                {
                    compData = "ea";
                }
                else
                    {
                        compData = "blz";
                    }
        }
    }
        salesFile.Close();
        gamesFile.Close();
        compFile.Close();

当我单击搜索按钮时,程序变得无响应,我想知道是否有人指出我做错了什么,谢谢。

C# 一次读取 3 个文件,搜索字符串并显示结果

听起来你追求的是多线程/并发/并行编程,并且有多种方法可以做到这一点......

因此,这里有一些可以帮助您入门的内容。

string[] textFilePaths = new string[]{"games.dat", "SalesNumbers.dat", "company.dat"};
ConcurrentBag<string> bagOfStrings = new ConcurrentBag<string>();
Parallel.ForEach(textFilePaths, path => 
{
    string text = File.ReadAllText(path);
    bagOfStrings.Add(text);
});
foreach(var text in bagOfStrings)
{
    Console.WriteLine (text);
}

您的代码创建了一个无限循环。 您的while循环不会停止,直到您到达gamesFile的末尾。 但是,您实际gamesFile中读取的行不会运行,因为它被if (searchTxtBox.Text.Trim() == gamesData)包围。 您的gamesData变量在前几行中声明,但尚未为其赋值,因此为 null。 searchTxtBox.Text.Trim()不等于 null,因此您永远不会从 gamesFile 中读取。 所以,你永远不会到达gamesFile的尽头,你的while循环永远运行。

通读文件中各行的一个常见习惯用语是这样的:

while ((gamesData = gamesFile.ReadLine()) != null)
{
    // do something with gamesData here
}

这是有效的,因为 ReadLine 在到达文件末尾时返回 null。 所以,你可以写这样的东西:

while ((gamesData = gamesFile.ReadLine()) != null && (salesData = salesFile.ReadLine()) != null)