2013-08-28 71 views
1

我並不真的需要這個特性,但是如果我可以讓編譯器允許yield return與另一個IEnumerable<>一起允許,簡化一些代碼的機會就已經出現了。如下例:C#中的嵌套IEnumerable <>

static void Main(string[] args){ 
    foreach (string str in EnumerateA()) 
     Console.WriteLine(str); 
} 
static IEnumerable<string> EnumerateA(){ 
    yield return "1"; 
    yield return EnumerateB("2"); 
    yield return EnumerateB("3"); 
} 
static IEnumerable<string> EnumerateB(string num){ 
    yield return num + "+"; 
    yield return num + "-"; 
} 

我知道我可以代替

yield return EnumerateB("2")

foreach(string str in EnumerateB("2")) yield return str;

,並有工作,但就是這唯一的辦法將工作?我的目標是.NET 2.0

+0

是................................ –

回答

1

一個相當簡單的選擇,你可以使用正常的靜態方法來實現你的代碼。

只要定義這些:

public static class Enumerable 
{ 
    public static IEnumerable<T> Return<T>(T value) 
    { 
     yield return value; 
    } 

    public static IEnumerable<T> Concat<T>(params IEnumerable<T>[] lists) 
    { 
     foreach (var values in lists) 
      foreach (var value in values) 
       yield return value; 
    } 
} 

然後實現你的方法是這樣的:

static IEnumerable<string> EnumerateA() 
{ 
    return 
     Enumerable.Concat(
      Enumerable.Return("1"), 
      EnumerateB("2"), 
      EnumerateB("3")); 
} 

我知道這是不是像你一樣使用給出一個很好的流暢架構的靜態方法,但它不是我覺得太糟糕了。如果將來你升級你的代碼,它也會有所幫助。如果您遵循linq簽名,則代碼甚至可能仍會以很少的更改運行。

3

是的,這是它工作的唯一方法。每個值都應該使用「收益回報」返回,您不能將值作爲收集組返回。

這是錯誤的

static IEnumerable<string> EnumerateA() 
{ 
    yield return "1"; 
    yield return EnumerateB("2"); 
    yield return EnumerateB("3"); 
} 

正確的方法是

static IEnumerable<string> EnumerateA() 
{ 
    yield return "1"; 
    foreach (var str in EnumerateB("2")) 
    { 
     yield return str; 
    } 
    foreach (var str in EnumerateB("3")) 
    { 
     yield return str; 
    } 
} 
+0

這似乎是,如果我使用.NET 3.5 + I可以使用[Enumerable.Concat ](http://msdn.microsoft.com/en-us/library/bb302894(v = vs.90).aspx)返回這些「IEnumerable 」的串聯,如果我是'F#''我可以使用'yield!'。由於我既不使用,我認爲你可能是對的。 –

相關問題