【问题标题】:Limited enumerator wrapper有限的枚举器包装器
【发布时间】:2014-04-03 09:13:17
【问题描述】:
制作可移植集合我面临着对有限 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
【问题讨论】:
标签:
c#
.net
collections
ienumerable
ienumerator
【解决方案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>。
【解决方案2】:
我已经结束了 LimitedEnumerator 的这些普通版本和模板版本。
它们在所有可能的情况下都经过测试:)
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;
}
}
}