使用... IEnumerable <t>实现IEnumerable <t>

时间:2016-03-08 14:25:47

标签: c# ienumerable

我目前正致力于量身定制的不可变集合,而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();
}

这是一种可接受的模式,还是我做了一些根本错误的事情?

0 个答案:

没有答案