我有要求,我必须支持记录。所以我正在使用 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/