2016-08-30 120 views
5

我查看了.NET Core源代码,以便了解在收集实现IList时,对IEnumerable.Last()(LINQ)的调用是否得到优化,在我进行了一些快速基准测试之后,我怀疑是这种情况。然而,在此之前,检查输入是否实现了IPartitionIPartition is defined here,但我完全不明白它应该做什么。IP核在.NET核心中做什么?

什么是IPartition的目的,以及它如何能比的IList平时固定时间的索引更快(或者如果不是,为什么是输入IPartition检查早于IList)?

+0

它似乎被像'Take'这样的方法用来创建数据的一个子集。请记住,在使用'IQueryable'等完全加载数据之前,可以调用许多linq方法。检查'IPartition'可能会允许一些鬼鬼祟祟的优化。 –

回答

4

当集合支持索引时,它是对索引进行操作的可枚举方法(Take/Skip等)的优化。 IIListProvider是相关的。有几个implementations。在文件中搜索IPartition

有关于此的issues

IPartition允许将更高级别的操作委托给基础集合。例如,new int[10].Skip(1)速度较慢,因为所有数据都通过两个IEnumerable<int>运行。随着IPartition实施,这有效地变成for (int i = 1 ... 9) emit(list[i]);。所以它不使用中间枚举器,它调用比枚举稍快的列表索引器。

这是一个非常粗略的描述。我鼓励你看看Github的讨论和代码。