在IEnumerable<>;读取循环

本文关键字:读取 循环 lt IEnumerable gt | 更新日期: 2023-09-27 18:21:20

下面的简化代码迭代IEnumerable<int>。我想打印

1.2.===>34.

有没有办法在不使用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);
    }
}

在IEnumerable<>;读取循环

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

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

不能像那样修改foreach循环。如果IEnumerable允许,请使用for循环。

答案是否定的,没有办法在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);
}