2016-08-30 202 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的討論和代碼。