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?
Odpowiedz
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.
Rzeczywiście, LINQ to Entities jest udokumentowane * nie * zachowanie zamówienia po '.Where()' –
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'. –
@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
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.
Czy interfejs dla "IEnumerable" został udokumentowany w celu zachowania porządku? Czy możemy po prostu "wiedzieć", że to zrobi? –
@ Jim, 'IEnumerable' nie ma" Gdzie "w ogóle. Jest to metoda rozszerzenia i wzorzec zapytania, ale nie jest członkiem interfejsu. –
@CraigStuntz: Dobrze. 'Enumerable.Where', then. Nie widzę dokumentacji, która mówi, że zachowa porządek. –
- 1. Gdzie jest metoda przedłużania LINQ "Fold"?
- 2. LINQ i metoda przedłużania liczenia
- 3. Czy kolejność wyników re.findall jest gwarantowana?
- 4. Czy istnieje metoda równoważna LINQ?
- 5. Czy można stosować prywatne metody przedłużania?
- 6. Gwarantowana dostawa w SignalR
- 7. Przypisywanie literałów ze słownika Pythona: czy semantyka jest gwarantowana?
- 8. Metoda niestatyczna wymaga celu?
- 9. gwarantowana lokalizacja punktów wektorowych?
- 10. statyczne metody przedłużania
- 11. Wartość zamówienia i zamówienia nie jest pobierana poprawnie w mysql
- 12. Czy LINQ jest leniwy?
- 13. Czy ocena skrótu jest gwarantowana w C++, tak jak jest w Javie?
- 14. Czy należy powtórzyć wiele transakcji Clojure w transakcji w celu zachowania spójności?
- 15. Metoda Pythona w celu zwiększenia funkcji
- 16. Metoda niestatyczna wymaga celu C#
- 17. Metoda refaktoryzacji zawierająca zapytania LINQ
- 18. MOQ - LINQ predykaty w ustawieniach Metoda
- 19. LINQ podmiotom Dołącz + Gdzie Metoda
- 20. Dlaczego kapibara jest niedostępna w specyfikacji zamówienia?
- 21. Czy metoda getElementById() jest wydajna?
- 22. Czy istnieje sposób na wymuszenie polecenia cmdlet powershell-EXPORT-CSV w celu zachowania określonej kolejności kolumn?
- 23. Czy metoda rozszerzenia jest bezpieczna?
- 24. Jaka jest składnia ORDERBY w LINQ VB.NET?
- 25. Czy możliwe jest określenie rozmiaru kopii roboczej przed realizacją zamówienia?
- 26. Metoda wywoływania C celu dynamicznie z ciągiem
- 27. Jak można stwierdzić, czy metoda LINQ ma podwójne wyliczenie?
- 28. Klauzula SQL IN gwarantowana do oceny fałszywej
- 29. Usunięcie zachowania w związku
- 30. Metoda Linq do tworzenia sekwencji oddzielnych obiektów?
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. –
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
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. –