2013-08-21 2 views
2

Я работаю в Unity, и у меня большой скрипт. В какой-то момент скрипта будет запущена сопрограмма, foo. Я хочу, чтобы эта сопрограмма запускала еще одну функцию IEnumerator, bar, но я не хочу, чтобы bar начинался как сопрограммы. Скорее, мне нужно foo, чтобы начать работать, возможно, несколько раз, позвоните по телефону bar, дождитесь окончания работы бара и продолжите работу. На данный момент у меня сделать barIEnumerable сделать:C# Подождите, пока функция вернет выходную проработку, чтобы продолжить

void Start() { 
    StartCoroutine(foo()); 
} 

IEnumerator foo() { 
    //Do something up here 
    foreach (int x in bar()) { 
     yield return null; //Wait for bar to yield break 
    } 
    //Do more stuff down here 
    yield break; 
} 


IEnumerable bar() { 
    for (int x=0; x < 5; x++) { 
     //Do Something 5 Times 
     yield return x; 
    } 
    yield break;  
} 

Я искал, но я не могу найти правильный способ сделать это. Разумеется, будет более 10 таких функций «бара», поэтому я не хочу, чтобы каждый цикл я делал для цикла. Как я могу вызвать другие функции IEnuerator таким образом?

+1

То, что вы ищете, часто называют «выходным foreach». Это функция, которой не существует (несмотря на то, что ее часто запрашивают). Вы в значительной степени вынуждены делать именно то, что вы здесь делаете. – Servy

+0

@Servy Спасибо за быстрый ответ. Я забыл спросить, есть ли: Я пытаюсь заставить C# сделать то, что он не был создан? Это не очень C# -образный код? А если нет, как я должен делать то же самое? – scohe001

+0

Это то, что я сказал; это обычно запрашиваемая функция, но ее не существует. Это просто. Он может быть добавлен в какой-то момент в будущем, или может быть и не так. Пока это не так, вам нужно согласиться на это. – Servy

ответ

1

Что вы ищете что-то это часто называют yield foreach. Это функция, которой не существует (несмотря на то, что ее часто запрашивают). Вы в значительной степени вынуждены делать именно то, что вы здесь делаете.

Когда вы пишете блок итератора, и вы хотите получить каждый из элементов другого IEnumerable или IEnumerator отдельно, у вас нет выбора, кроме как для явного перечисления последовательности и получения каждого элемента. Было бы неплохо, если бы вы могли написать что-то вроде yield foreach Bar(), но вы не можете. Ваше существующее решение так же хорошо, как вы можете использовать текущие функции языка.

0

Как о чем-то вроде этого:

class Program 
{ 
    public class CoroutineThing 
    { 
     public IEnumerator foo() 
     { 
      //Do something up here 
      var nTimesInvoked = 0; 
      while (bar(nTimesInvoked++)) 
       yield return null; //Wait for bar to yield break 
      //Do more stuff down here 
      yield break; 
     } 
     bool bar(int nTimesInvoked) 
     { 
      if (nTimesInvoked < 5) 
      { 
       Console.WriteLine("Bar: {0}", nTimesInvoked); 
       // Do something; 
      } 
      return nTimesInvoked < 4; 
     } 
    } 
    public static void Main(params string[] args) 
    { 
     var cor = new CoroutineThing(); 
     var nFoo = 0; 
     var e = cor.foo(); 
     while (e.MoveNext()) 
     { 
      nFoo++; 
      Console.WriteLine("{0} times foo", nFoo); 
     } 
     Console.ReadLine(); 
    } 
} 
Смежные вопросы