LINQ-Datei ResX?
-
05-07-2019 - |
Frage
Ich versuche, einen Weg zu bauen, den Schlüssel für ein bestimmtes Stück Text in einer bestimmten .resx
Datei zur Laufzeit zu erhalten.
Zur Zeit kann ich öffnen und die Datei (mit ResXResourceReader
) lesen, aber ich habe einen foreach
verwenden, um über die gesamte Datei zu gehen.
Dies könnte ein Performance-Problem sein, da einige unserer .resx
Dateien ziemlich groß sind (in der Größenordnung von 2000 Strings) und wir können dies häufig tun.
Ich möchte LINQ to Objects verwenden, um dies zu fragen, wie ich das where
Verfahren annehmen relativ optimiert ist, aber ich habe es nicht gelungen, dies zu tun. Die ResXResourceReader
Klasse verfügt über zwei Methoden AsQueryable()
und GetEnumerator()
, aber weder erlauben LINQ gegen ihr Ergebnis (so from n in reader.AsQueryable() where
ausfällt).
Wie kann ich LINQ gegen etwas von den ResXResourceReader
vorgesehen, oder ist es auch die Zeit wert?
Lösung
Der folgende Code gibt eine IEnumerable-Objekt, das Sie LINQ ermöglicht die Verwendung des Inhalts einer Ressource-Datei abzufragen:
ResXResourceReader reader = new ResXResourceReader(myfile);
IEnumerable<DictionaryEntry> enumerator = reader.OfType<DictionaryEntry>();
Andere Tipps
Haben Sie darüber nachgedacht, nur einige Vorverarbeitung tun?
Sie könnten die Resx Datei laden, dann Schleife über die Schlüssel-Wert-Paare, und sie dann speichern umgekehrt in einer Hash-Tabelle (dh der Schlüssel in der Hash-Tabelle ist eigentlich der Wert der Ressource und der Wert in der Hash-Tabelle ist der Schlüssel, der Ressource). Dann werden die Übersetzungen von wert-> -Taste würde schnell sein. Die einzige Sorge ist, wie Sie Duplikate (mehr Ressourcen mit dem gleichen Wert) behandeln.
Das ist nicht wirklich wert Ihre Zeit. LINQ hat keine Mittel, um Ihre .resx mehr effizient Datei zu suchen, als Sie können. Je nach Speichernutzung und ob oder nicht Caching der Daten für Sie Sinn macht, würden Sie wahrscheinlich besser dran, die gesamte Datei in einem Dictionary<TKey,TValue>
lesen und tun Sie Ihre Lookups auf diese Weise.
Sie können natürlich Ihr eigenes pletts Objekt erstellen Schlüssel / Wert-Paar zu speichern und in der gesamten Datei in eine Liste von diesen, dann lassen Sie LINQ zu Objekten lesen Sie Ihre Abfrage zu tun, aber dies wird nicht als schnell wie ein Dictionary
und würde mehr Aufwand erfordern.