Tag: 跳过

Array.Copy vs Skip and take in c#

我正在浏览这个问题和一些类似的问题: 从现有arrays获取子arrays 很多地方我都读到这样的答案: 从现有arrays获取子arrays 我想知道为什么Skip和Take不是数组的恒定时间操作? 反过来,如果它们是常量时间操作,那么Skip和Take方法(最后没有调用ToArray())是否具有相同的运行时间而没有执行Array.Copy的开销,而且空间效率更高?

为IList优化LINQ

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