0

有谁知道允许您使用 StreamReader 通过文本文件搜索字符串的方法,该方法允许您考虑查找结果的多个实例。基本上我正在创建一个预订应用程序,每次客户预订座位时,都会生成他们的 PrimaryKey、FirstName、LastName 以及数据网格上座位的坐标(我已将其用作预订座位的方法)然后保存到一个文本文件。

我希望能够读取 PrimaryKey 的多个实例,然后找到列出此 PrimaryKey 的每一行的座位坐标,并用这些坐标重新填充另一个类似的 datagridview,这些坐标都将由组合框驱动指数变化。

理解起来似乎有点复杂,但如果有人可以提供帮助,请告诉我。

我只需要如何搜索多个实例的知识,所以在它找到字符串一次然后查看文件的其余部分以找到另一个实例后,我可以自己完成其余的工作。

我正在使用 Visual Basic.Net 进行编码

4

1 回答 1

0

是的,可以多次搜索文件,但您要么必须重新打开文件,要么倒回流 (FileStream.Seek)。虽然非常低效。如果它必须保持未排序和非结构化文件,请为其构建内存索引。

如果您的键是整数,请Dictionary<int,int>在流中创建一个键和位置。然后,当您想找到键 X 时,您FileStream.Seek可以移动到它,并读取一行以获取数据。如果您发现自己按 aeroplaneID 进行分组,请构建一个Dictionary<Int, List<Int,Int>> 其中键是飞机 ID,列表是文件中主键和位置的列表。

您可以将所有这些都推到后台线程。您可以尝试变得非常聪明,并根据需要建立它们。就个人而言,虽然我会尝试将我的存储移动到更合适的格式。你努力做到这一点并不是因为你错过了一门课,你在努力是因为你不应该这样做。

就像是

Dictionary<int, int> _fileIndex = new Dictionary<int,int>();
using(FileStream fs = new FileStream(DataFileName,FileMode.Open,FileAccess.Read))
{
   StreamReader reader = new StreamReader(fs);
   int lastPosition = 0;
   string currentLine = null;
   while(currentLine = reader.ReadLine() != null)
   {
      String[] data = currentLine.Split(new char[] {','});
      int key = int.Parse(data[0]);
      fileIndex.Add(key,lastPosition);
      lastPosition = fs.Position;
   }
}

NB 没有测试上述内容,应该有更多的错误检查。如果行中有很多数据,那么最好不要使用 split 并将所有内容拉到正确的分隔符处。还要小心你保持多少索引,不久之后它们会占用更多的空间,而不是仅仅将整个内容读入内存。

然后你可以创建一个类或结构来实现文件中的一行,并编写一些代码来使用 FileStream.Seek) 到达那里。如果您想加载一堆它们,那么获取文件中每个位置的位置列表然后按顺序对它们进行排序是有意义的,那么您可以按照“顺序”将它们取出来翻阅文件。

于 2013-04-01T13:33:05.457 回答