我目前正在学习C#,目的是有效地使用Razor和Umbraco,我有一些
PHP背景和
JavaScript的合理知识.
我遇到了IEnumerator界面,很难理解它.我在下面设置了一个代码片段来演示使用foreach循环遍历数组:
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; namespace cardEnum { class suitsEnumerator { private static string[] suits = { "Hearts","Spades","Diamonds","Clubs" }; public void showAll() { foreach(string x in suits){ System.Console.WriteLine(x); } } } class run { static void Main() { Console.WriteLine("The suits are:"); var suits = new suitsEnumerator(); suits.showAll(); Console.ReadKey(); } } }
有人可以解释为什么我甚至需要使用IEnumerator,否则我可以很容易地遍历数组.我知道这是一个如此简单的问题,我只是想不出使用IEnumerable的原因.
任何帮助都将非常感谢,谢谢!
解决方法
这是在您的示例中实现枚举器模式的方式.我希望这澄清了一些事情,特别是IEnumerable和IEnumerator之间的关系:
namespace cardEnum { // simple manual enumerator class SuitsEnumerator : IEnumerator { private int pos = -1; private static string[] suits = { "Hearts","Clubs" }; public object Current { get { return suits[pos]; } } public bool MoveNext() { pos++; return (pos < suits.Length); } public void Reset() { pos = -1; } } class Suits : IEnumerable { public IEnumerator GetEnumerator() { return new SuitsEnumerator(); } } class run { static void Main() { Console.WriteLine("The suits are:"); var suits = new Suits(); foreach (var suit in suits) { Console.WriteLine(suit); } Console.ReadKey(); } } }
当然,这是一个帮助理解的人为例子.由于string []已经实现了IEnumerable,因此没有理由重新发明轮子.
由于C#支持yield关键字,因此最近创建Enumerator变得容易一些:
namespace cardEnum { // no explicit SuitsEnumerator required class Suits : IEnumerable { public IEnumerator GetEnumerator() { yield return "Hearts"; yield return "Spades"; yield return "Diamonds"; yield return "Clubs"; } } class run { static void Main() { Console.WriteLine("The suits are:"); var suits = new Suits(); foreach (var suit in suits) { Console.WriteLine(suit); } Console.ReadKey(); } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。