不久前,我编写了一个IList
扩展方法,通过使用索引来枚举列表的一部分。在重构时,我意识到可以通过调用来执行类似的查询Skip(toSkip).Take(amount)
。在对此进行基准测试时,我注意到它Skip
没有针对IList
. 通过一些谷歌搜索,我最终看到了 Jon Skeet 的一篇文章,讨论了为什么优化方法Skip
是危险的。
据我对这篇文章的理解,问题是在修改集合时优化方法中不会抛出异常,但正如评论所述,msdn 文档本身存在冲突。
如果对集合进行了更改,例如添加、修改或删除元素,则枚举器将不可恢复地失效,并且下一次调用 MoveNext 或 Reset将引发 InvalidOperationException。
在IEnumerator.GetEnumerator()中:
如果对集合进行了更改,例如添加、修改或删除元素,则枚举器将不可恢复地失效并且其行为是未定义的。
我在这两种约定中都看到了优点,并且对于是否进行优化有点迷茫。什么是合适的解决方案?我一直在考虑采用 Kris Vandermotten 在评论中提到的IList.AssumeImmutable()
方法。AsParallel()
是否已经存在任何实现,或者这是一个坏主意?