3

オブジェクトのコレクションを受け入れ、高速クエリ用に最適化されたインデックス付きデータ構造を返すライブラリを探しています。

これは、おそらく次の例でよりよく説明されています。

public class MyClass
{
    public sting Name {get;set;}
    public double Number {get;set;}
    public ... (Many more fields)
}     


var dataStore = Indexer.Parse(myClassCollection).Index(x => x.Name).Index(x => x.Number).Index( x => x.SomeOtherProperty);
var queryResult = dataStore.Where( x => x.Name == "ABC").Where(x => x.Number == 23).Where( x => x.SomeOtherProperty == dateTimeValue);

のクエリはdataStore、 のオーダーで非常に高速になるという考えですO(log n)

索引付けするフィールドが 2 つまたは 3 つを超えると、辞書の辞書の使用が複雑になり始めます。

このようなことを行う既存のライブラリはありますか?

4

4 に答える 4

2

オブジェクト指向データベースはどうですか。

スターリングが推奨されるオプションです。LINQ to Objectをサポートしているので、クエリについて心配する必要はありません。いくつかの中規模プロジェクトで良好な結果が得られました(かなり高速です)。

于 2012-09-25T01:18:38.707 に答える
1

RaptorDB も参照してください。完全に埋め込まれたバージョンを含むいくつかのバージョンは、ここの CodeProject にあります。

于 2012-10-03T17:25:42.160 に答える
0

Lucene.NETを使用することもできます。これは、メモリ内で完全に実行することもできます(ただし、それが必要かどうかはわかりません)。フィールド基準に基づいたドキュメントの超高速検索をサポートします。

つまり、実際にはドキュメントデータベースが得られます。それをさらに一歩進めると、RavenDB(商用)のようなものになります。

于 2012-09-25T01:24:40.267 に答える
0

インデックス付きプロパティごとに SortedDictionary を作成することでこれを達成できるかどうか疑問に思っています。

SortedDictionary<property, List<MyClass>>

次に、Linq 式ツリーを解析して、クエリ対象のプロパティを見つけます。sortedDictionaries の有効なキーを取得し、これらのキーをループして並べ替えられた辞書ごとに List を取得し、式ツリーに OR または AND ディレクティブがあるかどうかに応じて、Union() や Intersect() などの Set 操作を使用します。次に、検索条件に一致するリストを返します。

クエリにインデックスが作成されていないプロパティが含まれている場合は、最初にインデックスが作成されたプロパティを使用してクエリを実行し、次に通常の Linq を使用して終了します。

次に興味深いのは、式ツリーの解析です。

このアプローチについて何か考えはありますか?

于 2012-09-26T00:54:48.837 に答える