2012-08-16 80 views
3

請告知是那裏,以這樣的速度更快指標的LINQ查詢

var res = qlist.Where(o => o.left >= x && o.right >= x).ToList() 

的QList對象查詢最多可包含百萬個元素和這樣的查詢可能會很慢的標準方法。是否有任何索引linq或類似的東西?

感謝

更新: 對不起在評論不能回答。 這是LINQ到對象,目的是緩存DB。

+0

爲什麼你必須在內存中存儲milion元素,這是不是approriate解決方案,索引應該在數據庫中? – 2012-08-16 11:06:18

+1

這是Linq-to-objects?或者像Linq2Sql的其他任何環境? – sloth 2012-08-16 11:06:37

回答

3

雖然對數據庫進行查詢LINQ2SQL享受可在數據庫中定義的索引,也有在內存中執行LINQ查詢沒有索引。

不幸的是,您需要自己推出:對列表進行排序,使用List.BinarySearch獲取初始位置和最後位置,然後使用LINQ獲取它們之間的所有條目。

+0

謝謝您的回答。我正試圖緩存DB數據。 List.BinarySearch不會幫助。也許我需要寫我自己的R-tree索引 – irriss 2012-08-17 06:46:21

3

除了告訴你使用的數據庫爲(前面已經寫的),你可以通過兩種方式提高性能:

  1. 使用進行AsParallel:

    VAR解析度= qlist.AsParallel()。其中,(O => o.left> = X & & o.right> = X).ToList();

  2. 您可以將您的項目插入兩個不同的已排序列表,一個是left,另一個是right。對於一個給定的x,發現等於(或約等於)將它與二進制搜索的項目,並採取所有項目從兩個列出了項目之後。最終結果應該是從兩個列表中選擇的項目。我不知道它是否更有效。這取決於你做了多少次插入以及你會找到多少物品。

+0

謝謝您的回答。我正試圖緩存DB數據。 List.BinarySearch不會幫助。可能我需要編寫我自己的R-tree索引 – irriss 2012-08-17 06:47:09