加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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();
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读