【问题标题】:Converting List<string> to IEnumerator<string>将 List<string> 转换为 IEnumerator<string>
【发布时间】:2014-07-21 22:12:48
【问题描述】:

我无法弄清楚如何正确执行此操作。我在代码的最后一行收到此错误。错误说:

"不能隐式转换类型 'System.Collections.Generic.List 到 'System.Collections.Generic.IEnumerator'。显式 存在转换(您是否缺少演员表?)

这是函数的代码:

public IEnumerator<string> AddElementsAttributesRemoveElementsAttributes()
        {
            List<string> retval = new List<string>();

            try
            {

                    success = false;
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            return retval;

        }

我该如何解决这个问题?我是否需要以某种方式将返回值转换为不同的类型?

【问题讨论】:

  • 为什么需要将其返回为 IEnumerator&lt;string&gt; 而不是 IEnumerable&lt;string&gt;
  • 是我还是“存在显式转换”在这里根本没有帮助?

标签: c#


【解决方案1】:

要将列表实际返回为IEnumerator&lt;string&gt;,请执行以下操作:

return retval.GetEnumerator();

但是,将其返回为 IEnumerable&lt;string&gt; (可能)会更有意义,在这种情况下,您必须更改方法签名以指定 IEnumerable 而不是 IEnumerator

IEnumerator 只能迭代一次,而IEnumerable 可以多次迭代,这就是我认为您可能想要后者的原因。但如果不是,请更改您的退货声明。

【讨论】:

  • IEnumerator&lt;T&gt; 有一个Reset 方法,因此它可以实际上被迭代任意次数。还值得注意的是,某些Enumerable 对象创建的枚举器会导致副作用,因此您不能有效地使用它们来创建多个枚举器。
  • Reset 的典型实现是什么都不做,所以我不会依赖它。它可能适用于列表,但一般来说,不是那么多。
  • 当然,大多数相同的来源是相同的来源是IEnumerable 对象,不能创建多个IEnumerator 对象。在一般情况下,您也不能依赖能够从单个可枚举中获取多个枚举器。如果您不了解对象的特定信息,它们都是单次迭代。
【解决方案2】:

List&lt;T&gt; 实现了IEnumerable&lt;T&gt;,但不是IEnumerator&lt;T&gt;。一个 Enumerable 可以创建一个 Enumerator,它不是一个。

虽然您可以向List 询问它的枚举数并返回,但这样做几乎肯定不是您想要做的。在整个 C# 中,传递 Enumerable 对象而不是 Enumerator 对象并仅在最后可能的时刻使用 Enumerator 是惯用的,通常让 foreach 循环为您进行实际迭代。 foreach 循环可以接受 IEnumerable 而不是 IEnumerator 这一事实是这种做法的主要原因。

如果您将方法的返回类型更改为IEnumerable&lt;string&gt;,则返回类型将是您的List&lt;string&gt; 实现的类型,因此它将是可隐式转换的,并且不需要在此方法中进行其他更改。

【讨论】:

  • +1 很好的解释。确实,我错过了,以反对票告终!
【解决方案3】:

你可以试试这个:

public IEnumerable<string> AddElementsAttributesRemoveElementsAttributes()

而不是

public IEnumerator<string> AddElementsAttributesRemoveElementsAttributes()

您可以迭代 IEnumerable 次数,但使用 IEnumerator 是不可能的

【讨论】:

  • IEnumerator&lt;T&gt; 有一个Reset 方法,因此它实际上可以迭代任意次数。还值得注意的是,某些 Enumerable 对象创建的枚举器会导致副作用,因此您不能有效地使用它们来创建多个枚举器。因此,虽然您所描述的情况在某些情况下可能是正确的,但一般情况下并非如此,特别是这里不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 2021-01-13
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多