Ich versuche, einen Typ zu entwickeln, um die aktuelle Iterationsposition mit einer Liste zu verfolgen.Geben Sie ein, um die Position einer Liste mit IEnumerable zu verfolgen
Ich möchte es idealerweise mit einer foreach-Schleife mit der IEnumerable-Schnittstelle verwenden, aber die Schnittstelle hat keine Start/Stop-Ereignisse oder Methode zum Hooking, um die Zählung zurückzusetzen.
Zur Zeit habe ich eine GetNext() Methode erstellt, die den nächsten Wert in der Liste aus und erhöht einen Zählwert um 1.
Rückkehr Kennt jemand ich die gleiche Funktionalität erreichen können IEnumerable verwenden, so kann ich den Typ verwenden mit eine foreach-Schleife?
Also zum Beispiel; Stellen Sie sich vor, eine Liste enthält 10 Elemente. Eine Methode könnte eine Instanz des Typs auf Position 4 iterieren, dann Methode 2 würde die gleiche Instanz beginnend an Position 5 bis 6 iterieren, dann Methode 3 würde die restng von Position 7 bis 10 iterieren - also die Typinstanz verfolgt die aktuelle Position.
Alle Ideen werden sehr geschätzt (Code unten gezeigt). Dank
public sealed class PositionTracker<T> : IEnumerable
{
private readonly object _syncLock = new object();
private readonly IList<T> _list = new List<T>();
private int _current;
public PositionTracker(IList<T> list)
{
_list = list;
}
public T GetCurrent()
{
lock (_syncLock)
{
return _list[_current];
}
}
public T GetNext()
{
lock (_syncLock)
{
T t = GetCurrent();
if (_current < _list.Count - 1)
{
_current++;
}
return t;
}
}
public IEnumerator<T> GetEnumerator()
{
lock (_syncLock)
{
return _list.GetEnumerator();
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public void Reset()
{
lock (_syncLock)
{
_current = 0;
}
}
public int Count
{
get
{
lock (_syncLock)
{
return _list.Count;
}
}
}
}
[TestFixture]
public class PositionTrackerTests
{
[Test]
public void Position_CurrentPosition_Test()
{
List<string> list = new List<string>(new string[] { "A", "B", "C", "D" });
PositionTracker<string> positionTracker = new PositionTracker<string>(list);
Assert.IsTrue(positionTracker.GetNext().Equals("A"));
Assert.IsTrue(positionTracker.GetNext().Equals("B"));
Assert.IsTrue(positionTracker.GetNext().Equals("C"));
Assert.IsTrue(positionTracker.GetNext().Equals("D"));
}
}