2011-10-04 12 views
9

Jeśli mam listę wiadomości w architekturze publikowania/subskrybowania, zakładam, że uzasadnione jest używanie IEnumerable. Gdzie na bazowej liście, aby pobrać określone wiadomości i zaufać kolejność wiadomości?Czy metoda przedłużania LINQ jest gwarantowana w celu zachowania zamówienia?

+0

Należy zauważyć, że faktycznie nie ma takiej metody jak "IEnumerable.Where". Istnieje metoda rozszerzenia "Enumerable.Where", która akceptuje 'IEnumerable '. Ale jest całkiem możliwe, że dane zapytanie LINQ będzie używać czegoś innego dla danego przeliczalnego typu! I może być zaimplementowany w sposób zachowujący lub zachowujący porządek. –

+0

Wiem, że to nie jest członek, ale metoda rozszerzenia. Łatwiej było pisać i zakładam, że wszyscy wiedzą o metodach rozszerzenia linq. – LinusK

+0

Pamiętaj tylko, że dany wyliczalny typ może zdefiniować własną metodę 'Where()', która może być użyta zamiast 'Enumerable.Where()', w zależności od typu odnośnika, który wyliczasz. –

Odpowiedz

20

Metoda rozszerzenia Enumerable.Where będzie, ale metoda rozszerzenia Queryable.Where nie będzie.

musi zachować kolejność, ponieważ przesyła wyniki i nie ma pamięci podręcznej (ani logiki w wynikach buforowania).

Queryable.Where z drugiej strony tłumaczy dane zapytanie na coś, co zrozumie podstawowe źródło danych i nie ma żadnej gwarancji co do kolejności zamawiania. Efekt ten można łatwo zaobserwować podczas pracy z relacyjnymi bazami danych. Dodanie klauzuli where może pozwolić bazie danych wybrać inny indeks, co może zmienić kolejność wyników.

+0

Rzeczywiście, LINQ to Entities jest udokumentowane * nie * zachowanie zamówienia po '.Where()' –

+4

Podczas gdy prawdą jest, że 'Enumerable.Where' obecnie zachowuje porządek, nie widzę niczego w dokumentacji interfejsu, która gwarantuje, że będzie . No i oczywiście wszystkie zakłady są wyłączone, jeśli używasz 'ParallelEnumerable'. –

+1

@Jim: Zgadzam się z dokumentacją 'Enumerable.Where' nie stwierdza, że ​​zachowa porządek, ale myślę, że można bezpiecznie założyć, że zawsze zachowa porządek, ponieważ nadal byłaby to dość duża zmiana w zachowaniu, której wiele programiści polegają na. – Steven

7

Dla Linq to Objects/IEnumerable to prawda - zamówienie zostanie utrzymane - dla dostawców IQueryable to zależy od dostawcy, wielu dostawców nie utrzymuje zamówienia.

Wygląda na to, że ten fakt (utrzymywanie porządku) nie jest dokumentowany na MSDN, więc uważam to za szczegół implementacji, który - choć mało prawdopodobny - może ulec zmianie w przyszłości.

+0

Czy interfejs dla "IEnumerable" został udokumentowany w celu zachowania porządku? Czy możemy po prostu "wiedzieć", że to zrobi? –

+0

@ Jim, 'IEnumerable' nie ma" Gdzie "w ogóle. Jest to metoda rozszerzenia i wzorzec zapytania, ale nie jest członkiem interfejsu. –

+0

@CraigStuntz: Dobrze. 'Enumerable.Where', then. Nie widzę dokumentacji, która mówi, że zachowa porządek. –

Powiązane problemy