LINQ to resxファイル?
-
05-07-2019 - |
質問
特定の.resx
ファイル内の特定のテキストのキーを実行時に取得する方法を構築しようとしています。
現在、ファイルを開いて読み取ることはできますが(ResXResourceReader
を使用)、ファイル全体を検索するにはforeach
を使用する必要があります。
これはパフォーマンスの問題である可能性があります。いくつかのwhere
ファイルはかなり大きく(2000文字列程度)、これを頻繁に行っている可能性があるためです。
AsQueryable()
メソッドは比較的最適化されていると思われるので、LINQ to Objectsを使用してこれをクエリしたいと思いますが、そうすることはできませんでした。 GetEnumerator()
クラスには2つのメソッドfrom n in reader.AsQueryable() where
および<=>がありますが、どちらも結果に対してLINQを許可しません(したがって<=>は失敗します)。
<=>によって提供されるものに対してLINQを実行するにはどうすればよいですか、それとも時間の価値がありますか?
解決
次のコードは、LINQを使用してリソースファイルの内容を照会できるようにするIEnumerableオブジェクトを返します。
ResXResourceReader reader = new ResXResourceReader(myfile);
IEnumerable<DictionaryEntry> enumerator = reader.OfType<DictionaryEntry>();
他のヒント
前処理を行うことを検討したことがありますか?
Resxファイルをロードし、キーと値のペアをループして、それらをハッシュテーブルに反転格納することができます(つまり、ハッシュテーブルのキーは実際にはリソースの値です、ハッシュテーブルの値はリソースのキーです)。次に、value-<!> gt; keyの翻訳が高速になります。唯一の懸念は、重複(同じ値を持つ複数のリソース)の処理方法です。
これは本当に時間をかける価値はありません。 LINQには、.resxファイルを効率的に検索する手段はありません。メモリ使用量とデータをキャッシュすることが理にかなっているかどうかによっては、ファイル全体をDictionary<TKey,TValue>
に読み込んでそのようにルックアップする方が良いでしょう。
もちろん、独自の連符オブジェクトを作成してキー/値ペアを保存し、ファイル全体をこれらのリストに読み込んでから、LINQ toオブジェクトにクエリを実行させることができますが、これはそうではありませんDictionary
として高速で、より多くのオーバーヘッドが必要になります。