C# 学习笔记foreach的原理之一

如图
在这里插入图片描述

foreach的语法 很简单 但是里面的原理还是挺复杂的
想想以前都是数组 列表 字典 用foreach 来遍历的
重来没有遍历过一个自己定义的一个类 那能不能遍历了?

我们建立一个类 叫所有的员工类
里面就一个list
然后employ类里面有name age
(准备工作)

然后我们foreach员工管理类
肯定报错 错误为

在这里插入图片描述
缺少get迭代器的方法
发现这是接口 实现接口IEnumerable的方法

public IEnumerator GetEnumerator()
{
throw new NotImplementedException();
}

要返回一个 IEnumerator 一看是个接口我们新建一个类来继承IEnumerator
看看里面有些东西
发现里面有在这里插入图片描述
看方法名字 就猜的差不多了推出
然后介绍一下foreach 原理

在这里插入图片描述
完整的代码如下

 class Program
    {
        static void Main(string[] args)
        {
            //新建一个管理类 并在里面赋值
            EmployManger employ = new EmployManger
            {
                employs = new List<Employ>()
                {
                    new Employ(){name="张三"},
                    new Employ(){name="立式"}
                }
            };
            //foreach (var item in employ)
            //{

            //}

            //foreach原理 第一获取方法
            IEnumerator enumerator = employ.GetEnumerator();
            //找到下个元素
            while (enumerator.MoveNext())
            {
                Console.WriteLine(enumerator.Current);
            }
            Console.ReadLine();
        }
    }
    public class EmployManger:IEnumerable
    {
        public List<Employ> employs;

        public IEnumerator GetEnumerator()
        {
            return new EmployEnumerable() { targets = employs };
        }
    }
    public class EmployEnumerable : IEnumerator
    {
        public List<Employ> targets;
        int index=-1;
        //当前的数据 
        public object Current{ get { return targets[index].name; } }
        //下一个数据存在吗
        public bool MoveNext()
        {
            index++;
            return index <= targets.Count - 1;
        }

        public void Reset()
        {
            throw new NotImplementedException();
        }
    }

    public class Employ
    {
        public string name;
    }

不过这种设计模式可以画如下的图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值