別の言語から C# に変換するプロセスを継承しています。プロセスの多くのステップは、計算を行うために、大量のレコード (100K ~ 200K) になる可能性があるものをループします。これらのプロセスの一部として、通常、別のリストを検索して値を取得します。私は通常、この種のものを SQL ステートメントに移動します (そして、私たちができる場所があります) が、これらの場合、それを行う簡単な方法はありません。いくつかの場所で、コードをストアド プロシージャに変換しようとしましたが、期待したほどうまく機能していないと判断しました。
事実上、コードはこれを行います:
var match = cost.Where(r => r.ryp.StartsWith(record.form.TrimEnd()) &&
r.year == record.year &&
r.period == record.period).FirstOrDefault();
cost はローカルの List タイプです。1 つのフィールドだけを検索する場合は、おそらくこれを Dictionary に移動します。レコードも常に一意であるとは限りません。
明らかに、これは本当に遅いです。
インデックスを作成できるオープン ソース ライブラリI4Oに出くわしましたが、さまざまなクエリで失敗しました (ソース コードをデバッグする時間がありません)。また、.StartsWith または .Contains では機能しません (元のクエリの多くは、"A" を検索すると "ABC" で一致が見つかるという事実を利用しているため、StartsWith ははるかに重要です)。
この種のことを行う他のプロジェクト (オープンソースまたは商用) はありますか?
編集:
フィードバックに基づいて検索を行ったところ、一意ではないキーを持つ辞書をサポートするPower Collectionsが見つかりました。
私は ToLookup() をテストしましたが、うまく機能しました。元のコードほど高速ではありませんが、少なくとも許容範囲内です。45 秒から 3 ~ 4 秒に短縮されました。他のルックアップのトライ構造を見てみましょう。
ありがとう。