using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BallanceTasEditor.Utils {
///
/// 一种提前给定元素个数的的IEnumerable。
///
public sealed class CountableEnumerable {
///
/// 以直接方式构建。
///
/// 一个迭代器,其最多只能迭代给定次数。
/// 迭代器会迭代的次数。
public CountableEnumerable(IEnumerable enumerable, int count) {
m_Inner = enumerable;
m_Count = count;
}
///
/// 从数组便捷构建。
///
/// 要使用的数组。
public CountableEnumerable(T[] array) {
m_Inner = array;
m_Count = array.Length;
}
private IEnumerable m_Inner;
private int m_Count;
///
/// 获取迭代器对象。
///
/// 用于迭代的迭代器。
/// 当迭代器迭代次数与给定次数不匹配时。
public IEnumerable GetInner() {
int counter = 0;
foreach (var item in m_Inner) {
if (counter >= m_Count) {
throw new ArgumentException("Given IEnumerable is not stopped at given count.");
} else {
yield return item;
++counter;
}
}
if (counter != m_Count) {
throw new ArgumentException("Given IEnumerable is not stopped at given count.");
}
}
///
/// 获取该迭代器会迭代的次数。
///
/// 迭代器会迭代的次数,用于给使用该结构的方法提前分配必要的空间。
public int GetCount() {
return m_Count;
}
}
}