首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >键入以使用IEnumerable跟踪列表的位置

键入以使用IEnumerable跟踪列表的位置
EN

Stack Overflow用户
提问于 2009-06-29 09:29:40
回答 2查看 388关注 0票数 1

我正在尝试开发一种使用列表来跟踪当前迭代位置的类型。

理想情况下,我希望将它与一个使用IEnumerable接口的foreach循环一起使用,但是该接口没有启动/停止事件或用于挂接的方法来重置计数。

目前,我已经创建了一个GetNext( )方法,该方法返回列表中的下一个值,并将计数递增1。

有人知道我可以使用IEnumerable实现相同的功能吗?这样我就可以在foreach循环中使用该类型了。

例如,假设一个列表包含10个项目。一个方法可以将类型的实例迭代到位置4,然后方法2将从位置5到6迭代相同的实例,然后方法3将从位置7到10迭代剩余的实例-因此类型实例跟踪当前位置。

非常感谢任何想法(代码如下所示)。谢谢

代码语言:javascript
复制
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"));
    }
}
EN

回答 2

Stack Overflow用户

发布于 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+中这样做的

票数 2
EN

Stack Overflow用户

发布于 2009-06-29 09:35:28

请查看此链接:foreach with generic List, detecting first iteration when using value type

Jon Skeet提供了一个指向SmartEnumerable类的链接。它基本上是IEnumerable的包装器,它为您提供了一个包含项目索引的公共SmartEnumerable<string>.Entry类。

此外,没有什么能阻止你这样做:

代码语言:javascript
复制
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];
     }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1057399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档