我正在尝试开发一种使用列表来跟踪当前迭代位置的类型。
理想情况下,我希望将它与一个使用IEnumerable接口的foreach循环一起使用,但是该接口没有启动/停止事件或用于挂接的方法来重置计数。
目前,我已经创建了一个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"));
}
}发布于 2009-06-29 09:33:49
看看yield关键字。Especially this link of Chapter 6 of the Book 'C# in Depth' By Jon Skeet
附言:我希望您是在C#.NET 2.0+中这样做的
发布于 2009-06-29 09:35:28
请查看此链接:foreach with generic List, detecting first iteration when using value type
Jon Skeet提供了一个指向SmartEnumerable类的链接。它基本上是IEnumerable的包装器,它为您提供了一个包含项目索引的公共SmartEnumerable<string>.Entry类。
此外,没有什么能阻止你这样做:
public class MyClass
{
private List<String> list = new List<String>() { "1", "2", "3", "4", "5" }
public IEnumerable<String> GetItems(int from, int to)
{
for (int i=from; i<to; i++)
yield return list[i];
}
}https://stackoverflow.com/questions/1057399
复制相似问题