gpt4 book ai didi

c# - IEnumerator 返回记录

转载 作者:行者123 更新时间:2023-11-30 18:50:43 24 4
gpt4 key购买 nike

我有一个要求,我必须要有记录。所以我正在为此使用 IEnumerator。但是我可以通过 movenext 前进但是没有办法后退

最佳答案

这是包装 IEnumerator<T> 的一种方法, 通过在 List<T> 中捕获其内容随着它的移动:

public interface ITwoWayEnumerator<T> : IEnumerator<T>
{
bool MovePrevious();
}

public class TwoWayEnumerator<T> : ITwoWayEnumerator<T>
{
private IEnumerator<T> _enumerator;
private List<T> _buffer;
private int _index;

public TwoWayEnumerator(IEnumerator<T> enumerator)
{
if (enumerator == null)
throw new ArgumentNullException("enumerator");

_enumerator = enumerator;
_buffer = new List<T>();
_index = -1;
}

public bool MovePrevious()
{
if (_index <= 0)
{
return false;
}

--_index;
return true;
}

public bool MoveNext()
{
if (_index < _buffer.Count - 1)
{
++_index;
return true;
}

if (_enumerator.MoveNext())
{
_buffer.Add(_enumerator.Current);
++_index;
return true;
}

return false;
}

public T Current
{
get
{
if (_index < 0 || _index >= _buffer.Count)
throw new InvalidOperationException();

return _buffer[_index];
}
}

public void Reset()
{
_enumerator.Reset();
_buffer.Clear();
_index = -1;
}

public void Dispose()
{
_enumerator.Dispose();
}

object System.Collections.IEnumerator.Current
{
get { return Current; }
}
}

然后我会使用扩展方法公开这种枚举器:

public static class TwoWayEnumeratorHelper
{
public static ITwoWayEnumerator<T> GetTwoWayEnumerator<T>(this IEnumerable<T> source)
{
if (source == null)
throw new ArgumentNullExceptions("source");

return new TwoWayEnumerator<T>(source.GetEnumerator());
}
}

请注意,如果您正在处理的集合已经是一个索引集合,例如 T[],那么这绝对是矫枉过正。或 List<T> .这对于以下场景更有意义,例如当您枚举尚未采用方便索引形式的序列并且您希望能够向后和向前移动时。

关于c# - IEnumerator 返回记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3261153/

24 4 0