1 changed files with 90 additions and 0 deletions
@ -0,0 +1,90 @@ |
|||||
|
using System; |
||||
|
using System.Collections; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Security.AccessControl; |
||||
|
using System.Text; |
||||
|
|
||||
|
namespace Apewer |
||||
|
{ |
||||
|
|
||||
|
/// <summary></summary>
|
||||
|
public sealed class Enumerator<T> : IEnumerator<T>, IEnumerator, IDisposable |
||||
|
{ |
||||
|
|
||||
|
// 类的状态
|
||||
|
bool _disposed = false; |
||||
|
string _type; |
||||
|
|
||||
|
// 元素获取
|
||||
|
Func<int, Class<T>> _getter = null; |
||||
|
|
||||
|
// 迭代器
|
||||
|
int _index = 0; |
||||
|
T _current = default; |
||||
|
|
||||
|
#region IDisposable
|
||||
|
|
||||
|
/// <summary></summary>
|
||||
|
public void Dispose() |
||||
|
{ |
||||
|
_disposed = true; |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#region IEnumerator<T>
|
||||
|
|
||||
|
/// <summary></summary>
|
||||
|
public T Current |
||||
|
{ |
||||
|
get |
||||
|
{ |
||||
|
if (_disposed) throw new ObjectDisposedException(_type); |
||||
|
return _current; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
#region IEnumerator
|
||||
|
|
||||
|
/// <summary></summary>
|
||||
|
object IEnumerator.Current { get => Current; } |
||||
|
|
||||
|
/// <summary></summary>
|
||||
|
public bool MoveNext() |
||||
|
{ |
||||
|
if (_disposed) throw new ObjectDisposedException(_type); |
||||
|
|
||||
|
var value = _getter(_index); |
||||
|
if (value == null) return false; |
||||
|
|
||||
|
_current = value.Value; |
||||
|
_index++; |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
/// <summary></summary>
|
||||
|
public void Reset() |
||||
|
{ |
||||
|
if (_disposed) throw new ObjectDisposedException(_type); |
||||
|
_current = default; |
||||
|
_index = 0; |
||||
|
} |
||||
|
|
||||
|
#endregion
|
||||
|
|
||||
|
/// <summary>创建枚举器实例。</summary>
|
||||
|
/// <param name="getter">元素获取程序。传入参数为索引值,从 0 开始;枚举结束后应返回 NULL 值。</param>
|
||||
|
/// <exception cref="ArgumentNullException" />
|
||||
|
public Enumerator(Func<int, Class<T>> getter) |
||||
|
{ |
||||
|
if (getter == null) throw new ArgumentNullException(nameof(getter)); |
||||
|
_getter = getter; |
||||
|
_type = GetType().Name; |
||||
|
Reset(); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
Loading…
Reference in new issue