在'this'C#上为'foreach'实现GetEnumerator

joh*_*hni -2 c# arrays ienumerable enumerator

我有一个带有索引器的类。我希望能够在this上运行 foreach 循环,但它说我必须实现 Enumerator 接口。这让我实现了两种方法:

    #region IEnumerable implementation

    public IEnumerator<Type> GetEnumerator() {
        throw new NotImplementedException();
    }

    #endregion

    #region IEnumerable implementation

    IEnumerator IEnumerable.GetEnumerator() {
        throw new NotImplementedException();
    }

    #endregion
Run Code Online (Sandbox Code Playgroud)
  1. 你能举例说明这两者之间有什么区别吗?
  2. 它需要什么样的实现?

该类是这样构建的:

  1. 它有一个字段,它是一个用于保存数据的数组。
  2. 它有一个索引器来获取和设置上述数组中的特定元素。

我希望能够在类中的this上运行 foreach 循环,因此我可以使用索引器的获取和设置逻辑获取和设置数组字段。

这就是为什么我需要实现 GetEnumerator 方法,但我不知道那里需要什么样的实现。

谢谢你的帮助。

注意:我如何实现 IEnumerable<T>线程对我没有帮助,我已经阅读过了。唯一的实现是返回数组的枚举器。

wil*_*ien 9

这是实现 IEnumerable 的一个非常简单的示例:

public class SomeEnumerable : IEnumerable<string>
{
    private string[] values = new string[] { "foo", "bar" };

    #region Enumerator

    private IEnumerable<string> GetValues()
    {
        foreach(var s in values)
        {
            yield return s;
        }
    }

    #endregion Enumerator

    #region IEnumerable implementation

    public IEnumerator<string> GetEnumerator() {
        return GetValues().GetEnumerator();
    }

    #endregion

    #region IEnumerable implementation

    IEnumerator IEnumerable.GetEnumerator() {
        return GetEnumerator();
    }

    #endregion
}
Run Code Online (Sandbox Code Playgroud)

如果您正在做一些不寻常的事情,只需将 GetValues() 内部的逻辑替换为您需要的任何内容。

  • `GetValues` 方法是不必要的。它的主体可以直接放在`GetEnumerator` 方法中,因为C# 允许`yield return` 出现在返回`IEnumerator` 的方法中(以及返回`IEnumerable` 的方法)。 (3认同)