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