c# – 无法理解IEnumerator
发布时间:2020-12-16 01:48:44 所属栏目:百科 来源:网络整理
导读:我目前正在学习C#,目的是有效地使用Razor和Umbraco,我有一些 PHP背景和 JavaScript的合理知识. 我遇到了IEnumerator界面,很难理解它.我在下面设置了一个代码片段来演示使用foreach循环遍历数组: using System;using System.Collections;using System.Collec
我目前正在学习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(); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |