2017-08-16 72 views
0

我有一個大的IEnumerable,我想分成幾個。嵌套IEnumerable

// I want to do this 

    public A Method1(B b) 
    { 
     return Method2(b); 
    } 

好我的代碼 //切換應該工作委託

public IEnumerable<BufTrade> Split(BufTrade bufRecord) 
{ 
    switch(someFlag) 
{ 
    case "A": 

    // does not compile 
    return Impl1(bufTrade); 

    // does not compile 
    yield return Impl1(bufTrade); 
} 
} 

// implements for type A  
public IEnumerable<BufTrade> Impl1(BufTrade bufRecord) 
{ 
yield return trade1; 
yield return trade2; 

// etc 
} 
+0

我這個IEnumerable嵌套是什麼意思? – Dejan

+1

什麼是'BufTrade'? 「Impl1」如何編譯?你爲'IEnumerable '返回'IEnumerable '。 –

+0

如果包含每次嘗試生成的編譯時錯誤,它都會有所幫助。你可能會發現他們的信息。 –

回答

1

這是一個有點不清楚你正在嘗試做的,但由於Impl1返回IEnumerable<BufTrade>Split也返回相同的方法,您需要遍歷從Impl1中返回的值Splityield return中的每一個:

// in Split: 
foreach (var i in Impl1(bufRecord)) 
{ 
    yield return i; 
} 

這是一個相當尷尬的代碼,但這就是你需要做的,如果你想在這種情況下使用yield return。換句話說,你想Split是一個枚舉函數。

你嘗試只是:

return Impl1(bufTrade); 

是行不通的(與您提供的代碼),因爲不是所有的路徑返回一個值。另請注意,您不能混用yield returnreturn。你有一個枚舉器功能,使用yield return或者你有一個正則函數,只是使用return

+0

return Impl1(bufTrade)將不會編譯,因爲Impl1返回IEnumerable 和bufTrade預計 –

+0

@CaptainComic:當然它會編譯。 'Impl1'返回'IEnumerable '和'Split'返回'IEnumerable '它不會*使用'yield return'(這將需要返回一個'bufTrade',但它可以正常工作'return'(並不是所有的代碼路徑都返回一個不能承受的值),它將使'Split'只是一個普通的函數而不是一個枚舉器。 –