有没有人知道一种允许您使用StreamReader通过文本文件搜索字符串的方法,该方法允许您考虑查找结果的多个实例。基本上我正在创建一个预订应用程序,每次客户预订座位时,会生成他们的PrimaryKey,FirstName,LastName和数据网格上座位的坐标(我用作预订座位的方法)然后保存到文本文件。
我希望能够读取PrimaryKey的多个实例,然后找到列出此PrimaryKey的每一行的座位坐标,并使用这些坐标重新填充另一个类似的数据网格视图,这些坐标都将被驱动通过组合框指数的变化。
理解起来似乎有点复杂但是如果有人可以提供帮助那么请告诉我。
我只需要知道如何搜索多个实例,所以在找到字符串之后,然后查看文件的其余部分以查找另一个实例,我可以自己完成其余的工作。
我使用Visual Basic.Net进行编码
答案 0 :(得分: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没有测试上面的内容,应该在其中进行更多的错误检查。如果该行中有大量数据,那么可能最好不要起诉拆分并将所有内容拉出到正确的分隔符。另外要注意你保留了多少个索引,不久之后它们会占用更多的空间,而不仅仅是将整个内容读入内存。
然后你可以创建一个类或结构来在文件中实现一行,并编写一些代码 使用FileStream.Seek)到达那里。如果你想加载一堆'em',那么在文件中获取每个位置列表然后按顺序对它们进行排序是有意义的,那么你可以通过它的'order'来剔除文件。