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# 自定义迭代器实现的主要内容,如果未能解决你的问题,请参考以下文章