在IEnumerable<>中再读一项阅读循环?

时间:2014-09-09 22:48:09

标签: c# linq

以下简化代码迭代IEnumerable<int>。我想要打印

1
2
==> 3
4

没有使用IEnumerator的任何方式吗?

IEnumerable<int> r = new [] {1, 2, 3, 4};
foreach (var line in r)
{
    Console.WriteLine(line);
    if (line == 2) 
    {
        var n = r.GetOneMore????();
        Console.WriteLine("==> ", n);
    }
}

3 个答案:

答案 0 :(得分:2)

您可以在循环中检查最后的条件,并将状态保持到下一次迭代:

IEnumerable<int> r = new [] {1, 2, 3, 4};
bool marked = false;
foreach (var line in r) {
  if (marked) {
    Console.Write("==> ");
  }
  Console.WriteLine(line);
  marked = line == 2;
}

答案 1 :(得分:0)

你无法像这样修改foreach循环。如果您的IEnumerable允许,请使用for循环。

答案 2 :(得分:0)

答案是否定的,没有办法在foreach中“再读一个项目”。通过使用此结构,您承诺为每个项目循环一次,除非您选择提前终止。

我会更进一步地说,尝试为这种循环的一次迭代产生两行输出会让一个随意的读者期望总共有N + 1行输出,而不是N.这会误导。我不会这样做。

有多种策略可以安排在一次迭代中检查的项目可以影响另一次迭代的行为。像你想做的那样(对我来说)是一个滞后。我会这样做。

IEnumerable<int> r = new [] {1, 2, 3, 4};
int prevline = -1;
foreach (var line in r) {
    if (prevline == 2)
        Console.WriteLine("==> ", n);
    else Console.WriteLine(line);
}