Pregunta

Estoy tratando de crear una manera de obtener la clave para un fragmento de texto determinado en un momento determinado. .resx archivo en tiempo de ejecución.

Actualmente, puedo abrir y leer el archivo (usando ResXResourceReader) pero tengo que usar un foreach para revisar todo el archivo.

Esto podría ser un problema de rendimiento, ya que algunos de nuestros .resx Los archivos son bastante grandes (del orden de 2000 cadenas) y es posible que estemos haciendo esto con frecuencia.

Me gustaría usar LINQ to Objects para consultar esto, ya que asumo que where El método está relativamente optimizado, sin embargo, no he podido hacerlo.El ResXResourceReader la clase tiene dos métodos AsQueryable() y GetEnumerator(), pero ninguno permite LINQ contra su resultado (por lo que from n in reader.AsQueryable() where falla).

¿Cómo puedo LINQ contra algo proporcionado por el ResXResourceReader, ¿O incluso vale la pena dedicarle tiempo?

¿Fue útil?

Solución

El siguiente código devuelve un objeto IEnumerable que le permite usar LINQ para consultar el contenido de un archivo de recursos:

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

Otros consejos

¿Ha considerado simplemente hacer un preprocesamiento?

Puede cargar el archivo Resx, luego recorrer los pares clave-valor y luego almacenarlos invertidos en una tabla hash (es decir, la clave en la tabla hash es en realidad el valor del recurso , y el valor en la tabla hash es la clave del recurso). Entonces las traducciones de valor - & Gt; key serían rápidas. La única preocupación es cómo maneja los duplicados (múltiples recursos con el mismo valor).

Esto realmente no vale la pena.LINQ no tiene ningún medio para buscar su archivo .resx de manera más eficiente que usted.Dependiendo del uso de la memoria y de si el almacenamiento en caché de los datos tiene sentido para usted, probablemente sería mejor leer el archivo completo en un Dictionary<TKey,TValue> y hacer tus búsquedas de esa manera.

Por supuesto, podría crear su propio objeto tuplet para almacenar un par clave/valor y leer el archivo completo en una lista de estos, luego permitir que LINQ to objetos realicen sus consultas, pero esto no será tan rápido como un Dictionary y requeriría más gastos generales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top