【问题标题】: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&lt;int&gt;。如果你这样做了,那么当你尝试产生一个集合而不是意外的运行时行为时,你会得到一个编译时错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-07-12
          • 2014-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多