为什么要自定义这个呢?
需求的地方,如果创建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对象,循环迭代复用。
网友评论