Как реорганизовать использование итератора - PullRequest
0 голосов
/ 20 июня 2009

У меня есть некоторый код, который я хотел бы реорганизовать с использованием итератора C # (т.е. IEnumerable). К сожалению, я не могу понять, как лучше всего разрешить другим функциям работать с итератором без перезапуска итератора.

Например:

NewLineEnumerator nle = new NewLineEnumerator();

while (bytesRead > 0)
{
  var nlenum = nle.Process(inputData, bytesRead);
  foreach (string block in nlenum)
  {
    DoSomething(nlenum);
  }
}

void DoSomething(IEnumerable<string> myiter)
{
  foreach (var s in myiter)
  {
     // myiter is restarted, and begins at the start of the iterator again
  }
}

Вы можете спросить, почему я хотел бы сделать это. Причина в том, что у меня есть поток данных, окруженный «командными блоками». В зависимости от команды я отправляю ее в другую подфункцию для обработки. Поэтому я хочу продолжать повторять, где я остановился в потоке, либо в начале, либо в конце.

Есть предложения?

Ответы [ 2 ]

5 голосов
/ 20 июня 2009

Передайте IEnumerator вместо IEnumerable , вызвав GetEnumerator (). Это сохранит состояние через вызовы.

2 голосов
/ 20 июня 2009

Как сказал Ник, создайте один IEnumerator<string> и передайте его между методами. Код будет выглядеть примерно так:

NewLineEnumerator nle = new NewLineEnumerator ();

while (bytesRead > 0)
{
    var nlenum = nle.Process(inputData, bytesRead);
    using (var enumerator = nlenum.GetEnumerator())
    {
        while (enumerator.MoveNext())
        {
            DoSomething(enumerator);
            Console.WriteLine(enumerator.Current);
        }
    }

    // ensure that bytesRead is decremented by the code that runs above
}

void DoSomething(IEnumerator<string> myenum)
{
    while (myenum.MoveNext())
    {
        if (ShouldProcess(myenum.Current))
        {
            // process it
        }
        else
        {
            // return to outer loop
            break;
        }
    }
}

(Обратите внимание, что если вы используете .NET 1.0 и IEnumerable, а не IEnumerable<string>, оператор using может не скомпилироваться.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...