2013-07-15 11 views
7

W języku C#, będzie używać Select() do wyświetlania elementów z elementu zatrzymującego element IOrderedEnumerable?Czy IOrderedEnumerable.Select() zachowa kolejność elementów?

  • Jeśli tak, dlaczego to zwraca IEnumerable, a nie IOrderedEnumerable?
  • Jeśli nie, jak mogę to osiągnąć (oprócz korzystania z foreach)?

Zauważ, że to pytanie nie jest duplikatem this one - Mam tylko Select() klauzulę, wihtout Distinct().

EDIT

Tak, to jest LINQ to Objects. BTW, czy odpowiedź byłaby inna, gdybym faktycznie zadawała pytania SQL DB?

+0

Prawdopodobnie. Chociaż nie używam 'select', często stronicuję wyniki, najpierw zamawiając wyniki, a następnie wywołując' Skip' i 'Take', aby uzyskać podzbiór wyników związanych z bieżącą stroną. Zamówienie zawsze było niezawodnie utrzymywane, więc oczekiwałbym, że będzie działać tak samo podczas 'Select' ... po prostu przetestuj go i zobacz – musefan

+0

Czy to LINQ to Objects? –

+0

Jest trochę więcej szczegółów, kiedy używać 'IOrderedEnumerable' (i jego zastosowań, głównie stosując kryteria sortowania wtórnego) w tym poście http://stackoverflow.com/questions/8518557/when-to-return-iorderedenumerable –

Odpowiedz

9

Select nie zmienia kolejności elementów. Jest to streaming operator (MSDN), co oznacza, że ​​przetwarza elementy źródłowe w kolejności źródłowej i jeden po drugim wyświetla wyświetlane elementy.

Tak więc, jeśli wykonujesz projekcję uporządkowanego źródła, wyświetlane wyniki zachowują porządek elementów źródłowych.


jeszcze jedno - można się zastanawiać, dlaczego wynik nie implementuje IOrderedEnumerable<T>:

int[] items = { 2, 3, 1, 8, 5 }; 
IEnumerable<int> query = items.OrderBy(i => i).Select(i => i); 
bool isOrdered = query is IOrderedEnumerable<int>; // false 

To dlatego Select operator zwraca nowy obiekt iterator (WhereSelectArrayIterator w tym przypadku), który brzmi pozycji z kolekcji źródła (OrderedEnumerable w tym przypadku) jeden po drugim, element projektu i zwraca projekcję. Ten nowy obiekt iteratora nie implementuje interfejsu IOrderedEnumerable<T>, jest tylko prosty IEnumerable<T>. Kolekcja uporządkowana jest teraz źródłem iteratora, ale nie jest iteratorem.

Powiązane problemy