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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top