美文网首页
2021-03-09【c#】自定义迭代器:IEnumerable

2021-03-09【c#】自定义迭代器:IEnumerable

作者: 持刀的要迟到了 | 来源:发表于2021-03-12 11:21 被阅读0次

    为什么要自定义这个呢?
    需求的地方,如果创建List,需要在List中创建大量的对象放入。
    而实际情况,不需要创建这么多对象,通过自定义IEnumerator解决。
    这样还可以在foreach中调用。

    实操参考:https://blog.csdn.net/chenweicode/article/details/90762523

    需求

    自定义一个Rect类,表示一个矩形。里面有若干点。

    为了表示这些点,可以为每个格子创建一个真正的对象:

    通过继承自List,并在构造函数里创建所有的对象。
    但是,实际上,这个点,并没有什么含义,仅仅代表一个坐标,没有甚么额外的东西了。

    如果就只是这点需求的话,那完全可以通过,矩形所在位置,矩形的长宽,获得里面的每个点的位置。

    修改

    1.不要继承List,自定义迭代器

    2.删掉构造函数里的那么多对象初始化



    3.自定义迭代器类

    4.迭代器类代码

    public class RectIterator : IEnumerator<Vec>
        {
            private readonly Rect m_Rect;
            private int x;
            private int y;
    
            private Vec m_Vec = new Vec(0, 0);
    
            public RectIterator(Rect rect)
            {
                m_Rect = rect;
                x = rect.x - 1;
                y = rect.y;
            }
    
            public Vec Current
            {
                get
                {
                    m_Vec.SetXY(x, y);
                    return m_Vec;
                }
            }
    
            public bool MoveNext()
            {
                x++;
                if (x >= m_Rect.right)
                {
                    x = m_Rect.x;
                    y++;
                }
    
                bool rtn = y < m_Rect.bottom;
    
                if (!rtn)
                {
                    Reset();
                }
                return rtn;
            }
    
            public void Reset()
            {
                x = m_Rect.x - 1;
                y = m_Rect.y;
            }
    
            public void Dispose()
            {
                // 非常重要
                x = m_Rect.x - 1;
                y = m_Rect.y;
            }
    
    
            object IEnumerator.Current => Current;
        }
    

    这样就只有一个Vec对象,循环迭代复用。

    相关文章

      网友评论

          本文标题:2021-03-09【c#】自定义迭代器:IEnumerable

          本文链接:https://www.haomeiwen.com/subject/sexbqltx.html