diff --git a/Apewer/Enumerator.cs b/Apewer/Enumerator.cs new file mode 100644 index 0000000..6e08931 --- /dev/null +++ b/Apewer/Enumerator.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Security.AccessControl; +using System.Text; + +namespace Apewer +{ + + /// + public sealed class Enumerator : IEnumerator, IEnumerator, IDisposable + { + + // 类的状态 + bool _disposed = false; + string _type; + + // 元素获取 + Func> _getter = null; + + // 迭代器 + int _index = 0; + T _current = default; + + #region IDisposable + + /// + public void Dispose() + { + _disposed = true; + } + + #endregion + + #region IEnumerator + + /// + public T Current + { + get + { + if (_disposed) throw new ObjectDisposedException(_type); + return _current; + } + } + + #endregion + + #region IEnumerator + + /// + object IEnumerator.Current { get => Current; } + + /// + public bool MoveNext() + { + if (_disposed) throw new ObjectDisposedException(_type); + + var value = _getter(_index); + if (value == null) return false; + + _current = value.Value; + _index++; + return true; + } + + /// + public void Reset() + { + if (_disposed) throw new ObjectDisposedException(_type); + _current = default; + _index = 0; + } + + #endregion + + /// 创建枚举器实例。 + /// 元素获取程序。传入参数为索引值,从 0 开始;枚举结束后应返回 NULL 值。 + /// + public Enumerator(Func> getter) + { + if (getter == null) throw new ArgumentNullException(nameof(getter)); + _getter = getter; + _type = GetType().Name; + Reset(); + } + + } + +}