IEnumerator铸造?C#

IEnumerator铸造?C#,c#,C#,我正在学习IEnumerator和IEnumerable[通常是c#的新手]。 我试图从这个代码示例中学习: class colors : IEnumerable , IEnumerator { private string[] cols; private int iCurrent; public colors() { cols = new string[] { "Red", "White", "Blue", "Yellow" };

我正在学习IEnumerator和IEnumerable[通常是c#的新手]。 我试图从这个代码示例中学习:

 class colors : IEnumerable , IEnumerator
{
    private string[] cols;
    private int iCurrent;

    public colors()
    {
        cols = new string[] { "Red", "White", "Blue", "Yellow" };
        iCurrent = -1;

    }

    public IEnumerator GetEnumerator()
    {
        return (IEnumerator)this;
    }
}
  std::map<object>::iterator it
代码中还有更多内容,但我的问题是关于最后一行

首先,我不理解将返回什么,也不完全理解代码中的这一行。它是一个颜色IEnumerator类型,还是一个字符串类型。这个指向哪里/指向什么

其次,在CPP中,我记得我创建了迭代器,例如:

 class colors : IEnumerable , IEnumerator
{
    private string[] cols;
    private int iCurrent;

    public colors()
    {
        cols = new string[] { "Red", "White", "Blue", "Yellow" };
        iCurrent = -1;

    }

    public IEnumerator GetEnumerator()
    {
        return (IEnumerator)this;
    }
}
  std::map<object>::iterator it
std::map::迭代器

,然后我会在for[需要添加it.begin(),it.end()]循环中使用它。现在我明白了,在我创建了这个迭代器/IEnumerator之后,C#拥有foreach循环,这将节省我所有的头空间。但是有没有办法更容易/更快地创建枚举数?

有没有办法更容易/更快地创建枚举数?是,使用
yield return
语句。声明一个返回IEnumerable的方法,并在其中执行所有迭代。不需要MoveNext、Reset或Current。

实现
IEnumerator
应该留给实现您自己的自定义容器(就像在C++中实现hashset一样)
IEnumerable
,返回类型为
Object
的值,由容器实现,足以使用
foreach
IEnumerable
是更强类型的版本,很可能是您在这里想要的

示例中使用的字符串数组允许您将其内容枚举为
字符串
。下面是一些使用
IEnumerator
IEnumerator
而不自己实现枚举器的示例;也许他们会把你带到你想去的地方:

using System;
using System.Collections;
using System.Collections.Generic;

public class Colors : IEnumerable, IEnumerator
{
    private readonly string[] cols = new[] { "Red", "White", "Blue", "Yellow" };

    public IEnumerator GetEnumerator()
    {
        return cols.GetEnumerator();
    }
}

public class Colors2
{
    private readonly string[] cols = new[] { "Red", "White", "Blue", "Yellow" };

    public IEnumerable<string> Colors
    {
        get { return cols; }
    }
}

class Program
{
    static void Main(string[] args)
    {
        Test();
        Test2();
        Test3();
    }

    private static void Test()
    {
        var colors = new Colors();
        foreach (var c in colors)
        {
            // c is of type Object here because it's IEnumerable.
            Console.WriteLine(c);
        }
    }

    private static void Test2()
    {
        var colors2 = new Colors2();
        foreach (var c in colors2.Colors)
        {
            // c is of type String here because it's IEnumerable<string>.
            Console.WriteLine(c);
        }
    }

    private static void Test3()
    {
        foreach (var c in new[] { "Red", "White", "Blue", "Yellow" })
        {
            // c is of type String here.
            Console.WriteLine(c);
        }
    }
}
使用系统;
使用系统集合;
使用System.Collections.Generic;
公共类颜色:IEnumerable、IEnumerator
{
私有只读字符串[]cols=new[]{“红色”、“白色”、“蓝色”、“黄色”};
公共IEnumerator GetEnumerator()
{
返回cols.GetEnumerator();
}
}
公共类颜色2
{
私有只读字符串[]cols=new[]{“红色”、“白色”、“蓝色”、“黄色”};
公共数字颜色
{
获取{return cols;}
}
}
班级计划
{
静态void Main(字符串[]参数)
{
Test();
Test2();
Test3();
}
专用静态空隙试验()
{
var colors=新颜色();
foreach(颜色中的变量c)
{
//c在这里是Object类型,因为它是IEnumerable。
控制台写入线(c);
}
}
私有静态void Test2()
{
var colors2=新的colors2();
foreach(颜色2.Colors中的变量c)
{
//c在这里是字符串类型,因为它是IEnumerable。
控制台写入线(c);
}
}
私有静态void Test3()
{
foreach(新[]{“红”、“白”、“蓝”、“黄”}中的变量c)
{
//c在这里是字符串类型。
控制台写入线(c);
}
}
}

这个例子不完整。它通过返回一个枚举数来实现IEnumerable,但该类不会将自身实现为一个枚举数,而枚举数支持以这种方式返回。为此,它需要定义一个名为Current的属性,以及MoveNext和Reset方法。假设意图是迭代该数组,则GetEnumerator返回cols.GetEnumerator更有意义。但是,如果您遗漏的部分定义了MoveNext、Reset和Current,那么将对象本身作为IEnumerator返回是非常有意义的。因此,无论如何,返回的IEnumerator对象是类颜色的。@PaulKienitz您说对了两次。第一,我确实遗漏了部分代码,该部分确实包含Current、MoveNext和Reset。第二,我尝试返回cols.GetEnumerator,它给出了相同的输出,这类实现的是非泛型版本的
IEnumerable
。该接口不像现代代码中的
IEnumerable
那样经常使用。