2008-09-18 32 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

相关问题