2013-07-15 73 views
0

我发现数百个答案逐行阅读,但没有一个您可以指定想要阅读的行。 再说说我的文件看起来像这样:StreamReader读取特定行号

A 
B 
C 
D 
E 

,我想读线#3(在这种情况下,实际上线2 - 我想 - 可以说我想要的“C”)。

我该怎么做?

我当然可以做一个循环,并停在选定的行,但没有一个更好的(不那么丑)这样做?像MyStreamReader.Row(2).Read或类似的东西?

+0

除非你有一个包含结构,以帮助您找到行(使得它不再真正与传统意义上的行的文件),每个字节文件(或对必须进行检查以确定行结束符。我不确定你认为'Row(2)'能做什么优化。 –

+0

这个问题已经被回答了http://stackoverflow.com/questions/5404267/streamreader-and-seeking由于不同的编码格式,您不能使用StreamReader查找或修改流的位置。如果你的线是固定的长度,你可以使用FileStream并用(LineLength * NumberOfLines)寻找或设置位置。 –

+0

@Damien_The_Unbeliever - 我没有真的在寻找优化,只是一种写法,循环和停止索引。我正在寻找一个内置功能来做到这一点 - 并谈论优化;内置函数通常也会更快一些? – gubbfett

回答

1

最有效的方法是流线和计数每一行。在File.ReadAllLines之前,您必须等待在访问数组之前返回整个字符串数组。

一个简单的方法是使用File.ReadLines其工作原理类似于一个流读取器:

Dim thirdLine = File.ReadLines(path).ElementAtOrDefault(2) 

Enumerable.ElementAtOrDefault返回Nothing如果指定的索引过大。所以,你可以用这种方法检查:

If thirdLine IsNot Nothing Then 
    Console.WriteLine("Third line: " & thirdLine) 
Else 
    Console.WriteLine("The file doesn't contain 3 lines") 
End If 
+0

不错!谢谢! :) – gubbfett

+0

该方法仍读取整个文件,不是吗?例如,当您阅读索引2处的行时是否知道停止流式传输是否足够智能? –

+0

@ChrisDunaway:是的,只要索引达到延迟执行时间就立即停止。它与具有计数器变量的流读取器相同,只是更具可读性。但是,如果你在'ElementAtOrdefault'之前预先加入ToList或ToArray,整个文件将被读入内存。 –