是的,可以多次搜索文件,但您要么必须重新打开文件,要么倒回流 (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) 到达那里。如果您想加载一堆它们,那么获取文件中每个位置的位置列表然后按顺序对它们进行排序是有意义的,那么您可以按照“顺序”将它们取出来翻阅文件。