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; } } }