有限的枚举器包装器

时间:2014-03-02 12:58:52

标签: c# .net collections ienumerable ienumerator

制作可移植的集合我面临需要有限的IEnumerator,这将需要一些其他枚举器并限制它与给定的项目数。 我正在谈论来自LINQ的IEnumerable.Take(int)模拟。

所以我想要这样的东西:

var arr = new int[] {1, 2, 3, 4};
var originalEnumerator = arr.GetEnumerator();                   // Will enumerate 4 items
var limitedE =  new LimitedEnumerator(arr.GetEnumerator(), 2);  // Will enumerate 2 items
var limitedE2 = new LimitedEnumerator(arr.GetEnumerator(), 9);  // Will enumerate 4 items

2 个答案:

答案 0 :(得分:1)

我已经使用了限量版的这些普通版和模板版结束了。 它们在所有可能的情况下都经过测试:)

public class LimitedEnumerator : IEnumerator
{
    protected readonly IEnumerator _enumerator;
    private readonly int _limit;

    private int _index;

    public LimitedEnumerator(IEnumerator enumerator, int limit)
    {
        if (enumerator == null) 
            throw new ArgumentNullException("enumerator");

        if (limit < 0)
            throw new ArgumentOutOfRangeException("limit");
        _enumerator = enumerator;
        _limit = limit;
        _index = 0;
    }

    public bool MoveNext()
    {
        var moveNext = _enumerator.MoveNext();
        if (moveNext)
            Current = _enumerator.Current;

        return moveNext && ++_index <= _limit;
    }

    public void Reset()
    {
        _index = 0;
        _enumerator.Reset();
        Current = _enumerator.Current;
    }

    public object Current { get; private set; }
}

public class LimitedEnumerator<T> : LimitedEnumerator, IEnumerator<T>
{
    public LimitedEnumerator(IEnumerator<T> enumerator, int limit) 
        : base(enumerator, limit)
    {
    }

    public void Dispose()
    {
        ((IEnumerator<T>)_enumerator).Dispose();
    }

    T IEnumerator<T>.Current
    {
        get
        {
            return (T) Current;
        }
    }
}

答案 1 :(得分:1)

现有方法Enumerable.Take返回'有限'可枚举。

var arr = new int[] {1, 2, 3, 4};
var originalEnumerator = arr.GetEnumerator(); // Will enumerate 4 items
var limitedE =  arr.Take(2).GetEnumerator();  // Will enumerate 2 items
var limitedE2 = arr.Take(9).GetEnumerator();  // Will enumerate 4 items

通常您也不需要直接使用枚举器 - 请考虑使用IEnumerable<T>