制作可移植的集合我面临需要有限的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
答案 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>
。