使用探查器,我发现在.Last()
, 的实现上调用 Linq 扩展方法时IReadOnlyList
,将一直调用到集合结束,而不是使用复杂度为 O(1) 的索引GetEnumerator()
。MoveNext()
对于IList
,不存在这样的问题,因为扩展方法使用了可用的索引(参见此处的反射器代码)。
看来 Linq 需要更新才能IReadOnlyList
像IList
.
同时,实现 O(1) 复杂度的唯一方法是确保Last()
在我的类中显式实现,以便不使用 Linq 扩展方法。