如果我在郵件列表的發佈/訂閱架構,我認爲它是合理使用IEnumerable.Where在底層列表檢索特定的消息,並相信消息的順序?是LINQ擴展方法在哪裏保證維護秩序?
回答
的Enumerable.Where
擴展方法,但Queryable.Where
擴展方法的習慣。
Enumerable.Where
具有保留的順序的,因爲它流的結果,並沒有緩存(且在高速緩存的結果沒有邏輯)。
Queryable.Where
另一方面將給定的查詢翻譯爲底層數據源將理解的內容,並且不能保證如此排序。使用關係數據庫時,可以輕鬆觀察到這種效果。增加一個where
子句可以讓數據庫選擇另一個索引,這可以改變結果的排序。
事實上,LINQ到實體被記錄後,*不*爲了保持一個'。凡()' –
雖然這是真的,'Enumerable.Where'目前保持秩序,我沒有看到任何保證它將接口文檔中。當然,如果你使用'ParallelEnumerable',所有的注單都關閉。 –
@Jim:我同意的'Enumerable.Where'沒有說明它將維持秩序的文件,但我認爲它是安全的假設,它會永遠保留排序,因爲它仍然是一個相當大的行爲改變,很多開發者依賴。 – Steven
對於Linq to Objects/IEnumerable
這是事實 - 訂單將保持不變 - 對於IQueryable
供應商而言,它取決於供應商,許多供應商不維護訂單。
它看起來像這樣的事實(維持秩序)是不是在MSDN上記錄的,所以我會考慮它的實現細節 - 雖然可能性不大 - 可能會在未來改變。
是否記錄了IEnumerable接口以保持順序?或者我們只是「知道」它會? –
@Jim,'IEnumerable'根本沒有'Where'。這是一個擴展方法和查詢模式,但它不是接口的成員。 –
@CraigStuntz:很好。那麼'Enumerable.Where'。我沒有看到說它會保持秩序的文件。 –
- 1. List.partition是否保證維護秩序?
- 2. ToObservable擴展方法在哪裏?
- 3. IApplicationBuilder UseCookieAuthentication擴展方法在哪裏?
- 4. IBuffer byte []。AsBuffer擴展方法在哪裏?
- 5. LINQ方法是擴展方法嗎?
- 6. C#Linq在擴展/方法
- 7. 在LINQ擴展方法
- 8. 是否將擴展方法添加到ViewModel維護ViewModel規則?
- 9. 官方LINQ擴展方法
- 10. 哪個程序集包含LINQ擴展方法刪除?
- 11. Moq - setup在哪裏擴展?
- 12. 我在哪裏擴展AsyncTask?
- 13. 重寫LINQ擴展方法
- 14. C#-LINQ-擴展方法
- 15. LINQ兒童擴展方法
- 16. EF和LINQ擴展方法
- 17. NhQueryable LINQ擴展方法?
- 18. LINQ的擴展方法
- 19. 創建擴展方法LINQ
- 20. LINQ,Lambda,C#,擴展方法
- 21. LINQ的擴展方法 -
- 22. LINQ「WhereLike」擴展方法
- 23. Linq擴展加入方法
- 24. 在二維數組上實現LINQ風格的擴展方法
- 25. Linq查詢linq擴展方法
- 26. PrimeFaces cellEdit狀態在哪裏維護?
- 27. servlets中的會話在哪裏維護?
- 28. 模擬受保護的方法,該方法是一個擴展的抽象類
- 29. 如何保護Chrome擴展程序
- 30. 如何在Clojure中擴展受保護的方法
請注意,實際上沒有任何「IEnumerable.Where」這樣的方法。有一個'Enumerable.Where'擴展方法,它接受'IEnumerable'。但是給定的LINQ查詢完全有可能對給定的枚舉類型使用不同的東西!它可以以保持順序或無順序保存的方式實現。 –
我知道這不是一個成員,而是一種擴展方法。這只是更容易編寫,我假定每個人都知道linq擴展方法。 – LinusK
請記住,給定的枚舉類型可能會定義自己的Where()方法,該方法可能用於替代Enumerable.Where(),具體取決於您列舉的引用的類型。 –