C#中的IEnumerable <T>

fcu*_*112 8 c# ienumerable

我试图让以下代码编译,但在VS2008中遇到错误.谁能告诉我哪里出错了?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace dummy
{
    public class NaturalNumbersSequence : IEnumerable<int>
    {
        public IEnumerator<int> GetEnumerator()
        {
            for (int i = 1; i <= 1000; i++)
                yield return i;
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            for (int i = 1; i <= 1000; i++)
                yield return i;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            foreach (int i in new NaturalNumbersSequence())
                Console.WriteLine(i);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ang*_*son 24

好吧,我得到的第一个编译器错误是它抱怨:

使用泛型类型'System.Collections.Generic.IEnumerator'需要'1'类型参数

这是第16行,这一个:

IEnumerator IEnumerable.GetEnumerator()
Run Code Online (Sandbox Code Playgroud)

通过为System.Collections命名空间添加using指令来修复它(提示:将光标放在IEnumerator之后,在单词末尾的r上,然后按Ctrl +.(ctrl + dot-key),它应该建议你添加一个"使用System.Collections;"指令,做那个).

然后它编译并运行.这符合你的期望吗?

另外,请注意,您应该始终发布您获得的实际错误消息,这样我们就不会咆哮错误的树,如果您的代码出现其他问题,我们乍看之下就没有看到.

另外,你可以IEnumerable<T>通过从另一个方法调用其中一个方法来简化这个非常常见的实现,因此我将简化第二个方法的实现,如下所示:

IEnumerator IEnumerable.GetEnumerator()
{
    return GetEnumerator(); // this will return the one
                            // available through the object reference
                            // ie. "IEnumerator<int> GetEnumerator"
}
Run Code Online (Sandbox Code Playgroud)

这样您只需实现一次实际的枚举器代码.

最后看到Earwicker回答,它显示了更好的(至少在我看来)编写这整个代码的方法.


Dan*_*ker 9

不确定为什么你会收到错误,但这不会更简单吗?

public static class NumbersSequence
{
    public static IEnumerable<int> Naturals
    {
        get 
        {
            for (int i = 1; i <= 1000; i++)
                yield return i;
        }
    }
}

class Program
{
    public static void Main(string[] args)
    {
        foreach (int i in NumbersSequence.Naturals)
            Console.WriteLine(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 大家都知道1000以上的数字是不自然的. (12认同)
  • 为什么要停一千?! (5认同)
  • 二万是疯狂的高.等等....我们在这里谈论开发人员的工资,对吧? (3认同)
  • 对我来说,"常规"和"大"数字之间的区别是两万.我想这是一个"实现"的事情. (2认同)