2016-08-30 28 views
5

Spojrzałem na źródło .NET Core, aby dowiedzieć się, czy połączenia z IEnumerable.Last() (LINQ) są zoptymalizowane, gdy kolekcja implementuje IList, co do której podejrzewałem, że jest po krótkiej analizie porównawczej. It turns out that yes, the input is specifically checked for IList, jednak jeszcze przed tym jest sprawdzane, czy dane wejściowe implementuje IPartition. IPartition is defined here, ale w ogóle nie rozumiem, co ma robić.Co robi IPartition w .NET Core?

Jaki jest cel IPartition i jak mogłaby ona być szybciej niż zwykle stałą czasu indeksowania IList (lub jeśli nie, to dlaczego jest wejście sprawdzone IPartition wcześniej niż IList)?

+0

Wygląda na to, że jest używany przez metody takie jak 'Take', aby utworzyć podzbiór danych. Należy pamiętać, że wiele metod linq można wywołać przed pełnym załadowaniem danych podczas używania 'IQueryable' i podobnych. Sprawdzenie 'IPartition' może pozwolić na pewne podstępne optymalizacje. –

Odpowiedz

4

Jest to optymalizacja dla metod przeliczalnych, które działają na indeksy (Take/Skip i inne), gdy kolekcja obsługuje indeksy. IIListProvider jest pokrewna.

Istnieje kilka implementations. Wyszukaj plik dla IPartition.

Istnieje na ten temat numer issues.

pozwala przekazywać operacje wyższego poziomu do kolekcji bazowej. Na przykład: new int[10].Skip(1) jest powolny, ponieważ wszystkie dane są przesyłane przez dwa numery: IEnumerable<int>. Implementacja IPartition zmienia się w efektywnie for (int i = 1 ... 9) emit(list[i]);. Więc nie używa pośredników wyliczających i wywołuje indeksowanie listy, które jest nieco szybsze niż wyliczanie.

To bardzo przybliżony opis. Zachęcam do zapoznania się z dyskusjami na Github i kodem.