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

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

Myclass myclass = new Myclass();

foreach (string s in myclass)
{
}

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

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

【问题讨论】:

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

标签: operator-keyword keyword c#-2.0


【解决方案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())
            {

            }
        }
    }

希望这会有所帮助..

【讨论】:

  • 感谢您为编写示例代码付出的额外努力。它总是有帮助的。干杯!
猜你喜欢
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 2018-08-25
  • 2015-05-26
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多