2012-10-02 33 views
2

考慮下面的代碼:的IEnumerable與產量聲明

public static IEnumerable<float> Power(string ticker, float equity, float amount) 
{ 
    for (int k = 0; MajicNumber(ref k, amount);) 
    { 
     yield return CalculateStats(ticker, equity, k); 
     // Can we get the value of current resultset here? 
    } 
} 

由於該功能是維持這個結果集合,我們就可以訪問它?

傳統的對應是:

public static IEnumerable<float> Power(string ticker, float equity, float amount) 
{ 
    List<float> resultSet = new List<float>(); 
    for (int k = 0; MajicNumber(ref k, amount);) 
    { 
     resultSet.Add(CalculateStats(ticker, equity, k)); 
     // resultSet is accessible here 
    } 
    return resultSet; 
} 
+0

你的第二個例子應該是'List '不是'ArrayList' ... –

+0

@JamesMichaelHare,謝謝修復。 –

+0

訪問結果集時你想做什麼?出於某種原因你想訪問以前的值嗎?如果是這樣的話,「收益率回報」模型可能不是最好的方式。如果你想改變以前的值出於某種原因,那麼'yield return'肯定不會是你想要的。如果後面的代碼做了你想做的事情,爲什麼你想把它改變成前一種風格(假設這是發生的事情)? – Chris

回答

3

由於該功能是維持這個結果集合,我們就可以訪問它?

不,迭代器塊是而不是維護任何結果集。

+0

+1,謝謝,這是否意味着它也會*忽略「收益回報」後面的陳述? –

+1

產量回報後的陳述也將被執行 – PHeiberg

+0

@PHeiberg,那麼我們可以在'yield return'語句之後知道'CalculateStats(ticker,equity,k)'的返回值而不存儲到變量中嗎? –

3

當然,你可以做到這一點。邏輯不改變從第二代碼片段太多,除非你yield return的爲你找到他們的答案:

public static IEnumerable<float> Power(string ticker, float equity, float amount) 
{ 
    IList<float> resultSet = new List<float>(); 
    for (int k = 0; MajicNumber(ref k, amount);) 
    { 
     float r = CalculateStats(ticker, equity, k); 
     resultSet.Add(r); 
     yield return r; 
    } 
}