【问题标题】:Weird IEnumerable behavior in a foreach loopforeach 循环中奇怪的 IEnumerable 行为
【发布时间】:2012-07-11 07:00:02
【问题描述】:
我有以下方法:
public IEnumerable<object> GetParameters(Context context)
{
yield return new[] { 1, 2, 3 };
}
当我遍历这个枚举时:
foreach (var parameter in GetParameters())
{
// Do something here with parameter
}
我希望参数在第一个循环中为1,在第二个循环中为2,在第三个循环中为3,但事实并非如此:(
parameter 是一个包含所有值的数组!
我在这里错过了什么??
【问题讨论】:
标签:
c#
foreach
iterator
ienumerable
yield-return
【解决方案1】:
您正在返回可枚举数组的单个实例。
你想要:
yield return 1;
yield return 2;
yield return 3;
【解决方案2】:
改变你的方法
public IEnumerable GetParameters(Context context)
{
return new[] { 1, 2, 3 };
}
或
public IEnumerable GetParameters(Context context)
{
yield return 1;
yield return 2;
yield return 3;
}
【解决方案3】:
yield return 返回单个对象。您似乎正在执行类似 yield foreach 的操作,其中它会生成集合中的每个项目。 (这是一个经常被请求但不存在的功能。)
您只需要执行以下操作:
foreach(int i in new[]{1, 2, 3})
yield return i;
在可能的情况下,最好使用强类型的IEnumerable,在本例中为IEnumerable<int>。如果你这样做了,那么当你尝试产生一个集合而不是意外的运行时行为时,你会得到一个编译时错误。