3

このようなクエリを高速化する標準的な方法があるかどうかアドバイスしてください

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

qlist オブジェクトには最大 100 万個の要素を含めることができ、そのようなクエリは非常に遅くなる可能性があります。linq などのインデックスはありますか?

ありがとう

更新: 申し訳ありませんが、コメントではお答えできません。これはlinq-to-objectsであり、目的はDBをキャッシュすることです。

4

2 に答える 2

3

そのためにデータベースを使用するように指示する以外に (既に書かれているように)、次の 2 つの方法でパフォーマンスを向上させることができます。

  1. AsParallel を使用します。

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

  2. leftアイテムを 2 つの異なるソート済みリスト (1 つは byで、もう1 つは by で) に挿入できますright。指定された x について、バイナリ検索でそれに等しい (またはほぼ等しい) アイテムを見つけ、両方のリストからそのアイテムの後のすべてのアイテムを取得します。最終的な結果は、両方のリストから選択された項目になります。より効率的かどうかはわかりません。それは、挿入する回数と、見つけるアイテムの数によって異なります。

于 2012-08-16T11:14:52.390 に答える
3

データベースに対して実行される LINQ2SQL クエリは、データベースで定義されている可能性があるインデックスを利用しますが、メモリで実行される LINQ クエリにはインデックスがありません。

残念ながら、自分でロールバックする必要があります。リストをソートし、 を使用List.BinarySearchして最初と最後の位置を取得してから、LINQ を使用してその間のすべてのエントリを取得します。

于 2012-08-16T11:06:33.100 に答える