我有一个超过3000行的文本文件.我找到了使用的行数
string[] lines = File.ReadAllLines(myPath);
var lineCount = lines.Length;
Run Code Online (Sandbox Code Playgroud)
然后我生成一个随机数
Random rand = new Random();
var lineToRead = rand.Next(1, lineCount);
Run Code Online (Sandbox Code Playgroud)
现在我需要读取由随机数生成的特定行.我可以这样做
string requiredLine = lines[lineToRead];
Run Code Online (Sandbox Code Playgroud)
因为我的文件很大,我不认为创建如此大的数组是有效的.是否有更有效或更简单的方法来做到这一点?
这是一个迭代文件两次的解决方案(第一次计算行,下次选择行).好处是您不需要在内存中创建3000个字符串的数组.但是,如上所述,它可能会更慢.为什么可能?- 因为File.ReadAllLines在里面创建了一个字符串列表,并且该列表将在填充3000个项目时多次调整大小.(初始容量将是4.当内部数组完全填充时,将创建双倍大小的新数组,并且将在那里复制所有字符串).
因此,该解决方案使用的File.ReadLines方法返回IEnumerable<string>行和跳过您不需要的行:
IEnumerable<string> lines = File.ReadLines(myPath);
var lineToRead = rand.Next(1, lines.Count());
var line = lines.Skip(lineToRead - 1).First();
Run Code Online (Sandbox Code Playgroud)
BTW,内部File.ReadLines使用SteamReader逐行读取文件.