Domanda

Sto cercando di creare un modo per ottenere la chiave per un dato pezzo di testo in un dato .resx file in fase di esecuzione.

Attualmente, posso aprire e leggere il file (usando ResXResourceReader) ma devo usare un foreach per ripassare l'intero file.

Questo potrebbe essere un problema di prestazioni, poiché alcuni dei nostri where file sono abbastanza grandi (nell'ordine di 2000 stringhe) e potremmo farlo frequentemente.

Mi piacerebbe usare LINQ to Objects per interrogarlo, dato che suppongo che il metodo AsQueryable() sia relativamente ottimizzato, tuttavia non sono stato in grado di farlo. La classe GetEnumerator() ha due metodi from n in reader.AsQueryable() where e <=>, ma nessuno dei due consente a LINQ di contrastare il loro risultato (quindi <=> fallisce).

Come posso LINQ contro qualcosa fornito da <=> o vale la pena?

È stato utile?

Soluzione

Il codice seguente restituisce un oggetto IEnumerable che consente di utilizzare LINQ per eseguire una query sul contenuto di un file di risorse:

ResXResourceReader reader = new ResXResourceReader(myfile);
IEnumerable<DictionaryEntry> enumerator = reader.OfType<DictionaryEntry>();

Altri suggerimenti

Hai pensato di fare solo un po 'di pre-elaborazione?

È possibile caricare il file Resx, quindi passare in rassegna le coppie chiave-valore e quindi memorizzarle invertite in una tabella hash (ovvero la chiave nella tabella hash è in realtà il valore della risorsa e il valore nella tabella hash è la chiave della risorsa). Quindi le traduzioni di valore - & Gt; key sarebbero veloci. L'unica preoccupazione riguarda il modo in cui gestisci i duplicati (più risorse con lo stesso valore).

Non vale davvero la pena. LINQ non ha alcun mezzo per cercare il tuo file .resx in modo più efficiente di quanto potresti. A seconda dell'utilizzo della memoria e se la memorizzazione dei dati nella cache ha senso per te, probabilmente sarebbe meglio leggere l'intero file in un Dictionary<TKey,TValue> e fare le tue ricerche in quel modo.

Potresti, ovviamente, creare il tuo oggetto tuplet per archiviare una coppia chiave / valore e leggere l'intero file in un elenco di questi, quindi consentire a LINQ agli oggetti di eseguire le query, ma non sarà così veloce come Dictionary e richiederebbe più spese generali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top