2008-09-18 33 views
4

對於執行比調用myEnumerable.AsQueriable()時獲得的默認O(n)線性搜索性能更好的linq-to-objects,是否有任何IQueriable實現?IQueriable <T>對於比O(n)性能好的對象嗎?

我看了一下http://www.codeplex.com/i4o/,它有更好的性能,但似乎依賴在IndexedCollection上使用擴展方法,而不是使IndexedColleciton實現IQueriable。

我很想讓我的界面返回IQueriable <T>因爲我不想讓任何人知道他們是否正在緩存或數據庫。

回答

0

固有的,非索引資源的任何查詢(例如作爲列表或IEnumerable)最多隻能是O(n),因爲它必須迭代列表中的每個項目才能檢查條件。爲了獲得比O(n)更好的性能,你需要考慮以某種形式索引數據。

正如你所提到的,你可能想看看一個庫來包裝創建這些索引,特別是如果你只想公開IQueryable。

如果您有興趣使用更爲人工的方式查找性能更好的數據,那麼我建議您查看字典以便通過密鑰進行高效查找,或者如果需要執行範圍查詢,則可能使用b樹。 Here's a nice MSDN如果您對其背後的理論感興趣,可以發佈有關b-樹的數據結構。另外,NGenerics可能是一個有趣的項目,看看。

1
+0

確實如此,但在很多方面,並行化是最後的手段(拋出更多的硬件) - 如果我可以對屬性進行索引,那麼我們應該能夠獲得一個/兩個數量級的提高一個IQueriable支持一個不那麼天真的數據結構。 – Squirrel 2008-09-19 10:09:32

0

另一種答案可能是通過在內存中對象數據庫來支持它,如:db4o

相關問題