2013-08-21 41 views
2

我正在Unity中工作,並且我有一個大腳本。在腳本的某個位置,將啓動一個協程foo。我想讓這個協程運行另一個IEnumerator函數,bar,但我不想bar作爲一個協程啓動。相反,我需要foo才能開始運行,可能會產生幾次,請撥打bar,等待欄已完成運行,然後繼續運行。目前我在做barIEnumerable做:C#等待函數返回yield break繼續

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

你要找的東西通常被稱爲'yield foreach'。這是一個不存在的功能(儘管需求頻繁)。你幾乎被迫完成你在這裏做的事情。 – Servy

+0

@Servy感謝您的快速回復。我忘了問的是:我是否試圖強制C#去做一些它沒有做的事情?這不是非常C#的代碼?如果不是,我該如何做同樣的事情? – scohe001

+0

這就是我所說的;這是一個通常要求的功能,但它不存在。就是這樣。它可能會在未來某個時候添加,或者可能不會。在此之前,你需要爲此做出解決。 – Servy

回答

1

什麼你要找的東西經常被稱爲yield foreach。這是一個不存在的功能(儘管需求頻繁)。你幾乎被迫完成你在這裏做的事情。

當你正在編寫一個迭代器塊,並且你希望單獨產生其他IEnumerableIEnumerator的每個項目時,你別無選擇,只能明確地枚舉序列併產生每個項目。如果你可以寫一些類似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(); 
    } 
}