C# 自定义迭代器实现
C# Custom Iterator Implementation
我有一个 class,比如 Myclass,带有一个列表变量,比如字符串列表,我想在循环中从 Myclass 对象实例外部调用它, 简而言之:
Myclass myclass = new Myclass();
foreach (string s in myclass)
{
}
我怀疑它在 属性 上使用了 Myclass 中的隐式运算符关键字。语法 grrr..!有帮助吗?
(不确定这是否是个好习惯,但有时它会派上用场)。
Foreach 基本上按顺序工作。您的 MyClass
需要实施 IEnumerable 并最终 return 通过 GetEnumerator 实施 IEnumerator。
IEnumerator 基本上提供了 MoveNext 和 Current 属性,您的 foreach 循环使用它们来一个接一个地查询序列元素。
您可以通过在 C# 中搜索 Iterators 来获得更多相关信息。添加简短的片段,以便您可以直观地理解我的意思:
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())
{
}
}
}
希望这对您有所帮助..
我有一个 class,比如 Myclass,带有一个列表变量,比如字符串列表,我想在循环中从 Myclass 对象实例外部调用它, 简而言之:
Myclass myclass = new Myclass();
foreach (string s in myclass)
{
}
我怀疑它在 属性 上使用了 Myclass 中的隐式运算符关键字。语法 grrr..!有帮助吗?
(不确定这是否是个好习惯,但有时它会派上用场)。
Foreach 基本上按顺序工作。您的 MyClass
需要实施 IEnumerable 并最终 return 通过 GetEnumerator 实施 IEnumerator。
IEnumerator 基本上提供了 MoveNext 和 Current 属性,您的 foreach 循环使用它们来一个接一个地查询序列元素。
您可以通过在 C# 中搜索 Iterators 来获得更多相关信息。添加简短的片段,以便您可以直观地理解我的意思:
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())
{
}
}
}
希望这对您有所帮助..