如何在while循环中跳过多次迭代

时间:2014-09-05 18:03:26

标签: c# while-loop streamreader continue

我在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)
        }
    }
}

4 个答案:

答案 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;
        }  
    }
}