我在While循环中逐行读取文本文件。当我到达特定行时,我想跳过当前和接下来的3次迭代。
我想我可以使用计数器和类似的东西来做到这一点。但我想知道是否有更优雅的方式?
using (var sr = new StreamReader(source))
{
string line;
while ((line = sr.ReadLine()) != null)
{
if (line == "Section 1-1")
{
// skip the next 3 iterations (lines)
}
}
}
答案 0 :(得分:4)
有一个for
循环执行sr.ReadLine
3次并丢弃结果,如:
using (var sr = new StreamReader(source))
{
string line;
while ((line = sr.ReadLine()) != null)
{
if (line == "Section 1-1")
{
for (int i = 0; i < 3; i++)
{
sr.ReadLine();
}
}
}
}
您应该检查sr.ReadLine
返回null
或者流是否已结束。
答案 1 :(得分:2)
您可以将File.ReadAllLines
与方法扩展一起使用:
public static IEnumerable<string> SkipLines(string file, string line, int count)
{
var enumerable = File.ReadLines(file).GetEnumerator();
while (enumerable.MoveNext())
{
var currentLine = enumerable.Current;
if (currentLine == line)
{
var currentCount = 0;
while(enumerable.MoveNext() && currentCount < count)
{
currentCount += 1;
}
}
yield return currentLine;
}
}
用法:
foreach (var line in SkipLines(source, "Section 1-1", 3))
{
// your line
}
请记住:ReadLines
是懒惰的 - 并非所有行都会立即加载到内存中。
答案 2 :(得分:1)
让自己成为丢弃给定行数(DiscardLines
)并使用它的函数:
string line;
while ((line = sr.ReadLine()) != null)
{
if (line == "Section 1-1")
{
DiscardLines(sr, 3);
}
}
这使主循环变得非常简单。该计数器现已隐藏在DiscardLines
。
答案 3 :(得分:1)
using (var sr = new StreamReader(source))
{
string line;
int linesToSkip = 0;
while ((line = sr.ReadLine()) != null)
{
if (linesToSkip > 0)
{
linesToSkip -= 1;
continue;
}
if (line == "Section 1-1")
{
// skip the next 3 iterations (lines)
linesToSkip = 3;
}
}
}