C# 自定义迭代器实现

Posted

技术标签:

【中文标题】C# 自定义迭代器实现【英文标题】:C# Custom Iterator Implementation 【发布时间】:2018-02-04 08:20:23 【问题描述】:

我有一个类,比如 Myclass,有一个列表变量,比如字符串列表,我想在循环中从 Myclass 对象实例外部调用它,简而言之:

Myclass myclass = new Myclass();

foreach (string s in myclass)


我怀疑它在属性上使用 Myclass 内的隐式运算符关键字。语法 grrr..!有什么帮助吗?

(不确定这是否是一种好习惯,但有时它会派上用场)。

【问题讨论】:

该类不能假定具有它的属性类型的属性和行为。这就是为什么 MyClass 的实例不能作为它的属性进行迭代的原因。您需要在类中实现 IEnumerable 接口并实现其内部处理列表属性的方法。 似乎我在这方面做得很差。当然,现在我知道答案对我来说非常有意义:) 谢谢! 【参考方案1】:

Foreach 基本上是按顺序工作的。您的MyClass 需要实现 IEnumerable 并最终通过 GetEnumerator 返回 IEnumerator 实现。

IEnumerator 基本上提供了 MoveNext 和 Current 属性,您的 foreach 循环使用这些属性一个接一个地查询序列元素。

您可以通过搜索 C# 中的迭代器来获得更多信息。添加简短的 sn-p 以便您可以想象我的意思:

 public class MyIterator : IEnumerable<string>
    
        List<string> lst = new List<string>  "hi", "hello" ;
        public IEnumerator<string> GetEnumerator()
        
            foreach(var item in lst)
            
                yield return item;
            
        

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

    public class Consumer
    
        public void SomeMethod()
        
            foreach(var item in new MyIterator())
            

            
        
    

希望这会有所帮助..

【讨论】:

感谢您为编写示例代码付出的额外努力。它总是有帮助的。干杯!

以上是关于C# 自定义迭代器实现的主要内容,如果未能解决你的问题,请参考以下文章

OOPC++自定义类型的迭代器

自定义迭代器实现导致内存泄漏

c++为自定义矩阵类实现迭代器

C#实现迭代器

为自定义数组实现迭代器

Apex 中的自定义迭代器