IEnumerator casting? C#

本文关键字:casting IEnumerator | 更新日期: 2023-09-27 18:15:40

我正在学习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;
    }
}

有更多的代码,但我的问题是关于最后一行。

首先,我不明白将返回什么,不完全理解这行代码。它是一个colorienumerator类型,还是一个字符串类型。这个指向哪里/在什么上?

其次,在CPP中,我记得我创建了迭代器,例如:
  std::map<object>::iterator it

,然后在for[需要添加it.begin(), it.end()]循环中使用它。现在我明白了c#,在我创建了这个迭代器/IEnumerator之后,有了foreach循环,它将为我省去所有这些麻烦。但是有没有一种方法可以更容易/更快地创建它们呢?

IEnumerator casting? C#

是否有一种方法可以更容易/更快地创建枚举数?是的,用yield return声明。https://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx声明一个返回IEnumerable的方法,并在其中完成所有迭代。不需要MoveNext, Reset或Current

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

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

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);
        }
    }
}