2012-10-02 160 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; 
    } 
}