我查看了.NET Core的源代码,以了解在集合实现IEnumerable.Last()
时是否优化了对IList
(LINQ)的调用,我怀疑经过一些快速基准测试后就是这种情况。 It turns out that yes, the input is specifically checked for IList
,但是,甚至在此之前,还要检查输入是否实现IPartition
。 IPartition
is defined here,但我根本不了解它应该做什么。IPartition
的目的是什么?它怎么可能比IList
的通常恒定时间索引更快(或者如果不是,那么为什么要比IPartition
早检查输入的IList
)?
最佳答案
这是对集合支持索引时可作用于索引(Take/Skip等)的可枚举方法的优化。 IIListProvider
是相关的。
有一些implementations。在文件中搜索IPartition
。
关于此有issues。IPartition
允许将更高级别的操作委派给基础集合。例如,new int[10].Skip(1)
速度很慢,因为所有数据都通过两个IEnumerable<int>
运行。通过IPartition
的实现,这实际上变成了for (int i = 1 ... 9) emit(list[i]);
。因此,它没有使用中间枚举器,而是在调用列表索引器,该列表索引器比枚举要快一些。
这是一个非常粗糙的描述。我鼓励您查看Github讨论和代码。
关于c# - IPartition在.NET Core中做什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39232868/