J'essaie de développer un type pour suivre la position d'itération actuelle avec une liste. Je souhaite idéalement l'utiliser avec une boucle foreach à l'aide de l'interface IEnumerable, mais l'interface ne possède pas d'événements de démarrage/arrêt ou de méthode d'accrochage pour réinitialiser le comptage.Tapez pour suivre la position d'une liste à l'aide de IEnumerable
méthode Actuellement, j'ai créé un GetNext() qui retourne la valeur suivante dans la liste et incrémente un comptage par 1.
Est-ce que quelqu'un sait que je peux obtenir la même fonctionnalité en utilisant IEnumerable je peux utiliser le type avec une boucle foreach?
Ainsi, par exemple; Imaginez une liste contient 10 éléments. Une méthode pourrait itérer une instance du type en position 4, puis la méthode deux itérerait la même instance à partir de la position 5 à 6, puis la méthode 3 itérerait la position restante de la position 7 à 10 - donc l'instance de type suit la position actuelle.
Toutes les idées sont grandement appréciées (code ci-dessous). Merci
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"));
}
}