【问题标题】:IEnumerator casting? C#IEnumerator 铸造? C#
【发布时间】:2015-10-01 23:13:06
【问题描述】:

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

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

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

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

  std::map<object>::iterator it

,然后我会在 for[需要添加 it.begin() , it.end()] 循环中使用它。现在我明白了,在我创建了这个迭代器/IEnumerator 之后,C# 有 foreach 循环,这将使我免于烦恼。但是有没有办法更容易/更快地创建它们?

【问题讨论】:

  • 该示例不完整。它通过返回一个枚举器来实现 IEnumerable,但该类并未将自身实现为支持以这种方式返回的枚举器。为此,它需要定义一个名为 Current 的属性,以及 MoveNext 和 Reset 方法。假设目的是迭代该数组,GetEnumerator 返回 cols.GetEnumerator 会更有意义。但是,如果您遗漏的部分定义了 MoveNext 和 Reset 和 Current,那么将对象本身作为 IEnumerator 返回是非常有意义的。
  • 所以无论如何,返回的 IEnumerator 对象是类颜色的。
  • @PaulKienitz 你是对的两次。第一个确实我留下了部分代码,那部分确实包含 Current , MoveNext 和 Reset.2nd 我尝试了 return cols.GetEnumerator 并且它给出了相同的输出
  • 这个类实现了IEnumerable的非泛型版本也有点奇怪。在现代代码中,该接口不像 IEnumerable&lt;T&gt; 那样经常使用。

标签: c#


【解决方案1】:

有没有办法更容易/更快地创建枚举器?是的,使用 yield return 声明。 https://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx 您声明一个返回 IEnumerable 的方法,并在其中进行所有迭代。无需 MoveNext、Reset 或 Current。

【讨论】:

    【解决方案2】:

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

    在您的示例中使用的字符串数组允许您将其内容枚举为Strings。以下是一些使用IEnumeratorIEnumerator&lt;string&gt; 的示例,而无需自己实现枚举器;也许他们会带你去你想去的地方:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      相关资源
      最近更新 更多