我目前正致力于量身定制的不可变集合,而IEnumerable<T>
的标准实现与IEnumerator<T>
的具体实现相比,最初的预期更为人为。
该集合基本上是一个不可变数组,允许您创建新的不可变子数组,由原始数组的一个或多个间隔组成,没有内存压力(根本没有数组复制)。请注意,这些间隔不允许连续。
实现索引器逻辑相对容易,你只需要跟踪偏移量,间隔界限等。当我尝试在IEnumerator
界面中实现相同的行为时,代码开始看起来很糟糕而且很难跟随。整个IEnumerator
界面开始时感觉相当笨拙,我宁愿自己跳过实现它,让编译器付出艰苦的努力。
另外,我不得不担心行为重复,确保迭代器和索引器的行为完全相同,将来可能会有更多的工作。
所以,那就是说,我正在考虑完全跳过这个问题并做以下事情:
class myImmutableCollection<T>: IEnumerable<T>
{
...
private static IEnumerable<T> asEnumerable(this)
{
for (int i = 0; i < Count; i++)
yield return this[i];
}
public IEnumerator<T> GetEnumerator() => asEnumerable(this).GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
这是一种可接受的模式,还是我做了一些根本错误的事情?