我正在嘗試開發一個類型來跟蹤列表中的當前迭代位置。鍵入使用IEnumerable跟蹤列表的位置
我最好想用foreach循環使用IEnumerable接口,但接口沒有啓動/停止事件或掛鉤方法來重置計數。
目前我已經創建了返回列表中的下一個值的GetNext()方法,並遞增1
計數有誰知道我可以使用IEnumerable的,所以我可以用同類型實現相同的功能一個foreach循環?
因此,例如;想象一個列表包含10個項目。一種方法可以將類型的一個實例迭代到位置4,然後方法2將從位置5到6迭代相同的實例,然後方法3將從位置7迭代到剩餘的10 - 所以類型實例跟蹤當前位置。
任何想法都非常讚賞(代碼如下所示)。謝謝
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"));
}
}