为'实现GetEnumerator;foreach&x27;在';这';C#

为'实现GetEnumerator;foreach&x27;在';这';C#,c#,arrays,ienumerable,enumerator,C#,Arrays,Ienumerable,Enumerator,我有一个实现了索引器的类。 我希望能够在this上运行foreach循环,但它说我必须实现枚举器接口。这让我实现了两种方法: #region IEnumerable implementation public IEnumerator<Type> GetEnumerator() { throw new NotImplementedException(); } #endregion #region IEnumerable im

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

    #region IEnumerable implementation

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

    #endregion

    #region IEnumerable implementation

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

    #endregion
#区域IEnumerable实现
公共IEnumerator GetEnumerator(){
抛出新的NotImplementedException();
}
#端区
#区域可数实现
IEnumerator IEnumerable.GetEnumerator(){
抛出新的NotImplementedException();
}
#端区
  • 你能举例说明一下这两者的区别吗
  • 它需要什么样的实现 该类的构建方式如下:

  • 它有一个字段,该字段是用来保存数据的数组
  • 它有一个索引器来获取和设置上述数组中的特定元素
  • 我希望能够在类中的this上运行foreach循环,以便使用索引器的get和set逻辑获取和设置数组字段

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

    谢谢你的帮助

    注:
    这条线对我没有帮助,我读过了。唯一的实现是返回数组的枚举数。

    下面是一个实现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
    }
    
    公共类SomeEnumerable:IEnumerable
    {
    私有字符串[]值=新字符串[]{“foo”,“bar”};
    #区域枚举器
    私有IEnumerable GetValues()
    {
    foreach(值中的var s)
    {
    收益率;
    }
    }
    #端域枚举器
    #区域可数实现
    公共IEnumerator GetEnumerator(){
    返回GetValues().GetEnumerator();
    }
    #端区
    #区域可数实现
    IEnumerator IEnumerable.GetEnumerator(){
    返回GetEnumerator();
    }
    #端区
    }
    

    如果你正在做一些不寻常的事情,只要用你需要的任何东西替换GetValues()内部的逻辑就行了。

    为什么你不只是迭代这个内部数组,而不是
    这个
    ?因为它背后有一些逻辑。我应该只在特定情况下返回内部数组单元格的值。通常我应该返回一个保存在另一个字段中的值。它的可能副本对我没有帮助,因为那里没有具体的实现。它只是返回数组的枚举数。将您的实现放入
    公共IEnumerator GetEnumerator()
    ,然后让另一个只返回
    GetEnumerator()
    不需要
    GetValues
    方法。它的主体可以直接放在
    GetEnumerator
    方法中,因为C#允许
    yield return
    出现在返回
    IEnumerator
    的方法(以及返回
    IEnumerable
    的方法)中。