Вопрос

Я пытаюсь найти способ получить ключ для данного фрагмента текста в указанном .resx файле во время выполнения.

В настоящее время я могу открыть и прочитать файл (используя ResXResourceReader), но мне нужно использовать foreach для просмотра всего файла.

Это может быть проблема с производительностью, так как некоторые из наших where файлов довольно большие (порядка 2000 строк), и мы можем делать это часто.

Я бы хотел использовать LINQ to Objects для запроса этого, так как я предполагаю, что метод AsQueryable() относительно оптимизирован, однако я не смог этого сделать. У класса GetEnumerator() есть два метода from n in reader.AsQueryable() where и <=>, но ни один из них не позволяет LINQ сопоставлять их результат (поэтому <=> не выполняется).

Как я могу LINQ сопоставить что-то, предоставленное <=>, или оно того стоит?

Это было полезно?

Решение

Следующий код возвращает объект IEnumerable, который позволяет использовать LINQ для запроса содержимого файла ресурса:

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

Другие советы

Рассматривали ли вы просто предварительную обработку?

Вы можете загрузить файл Resx, затем выполнить цикл по парам ключ-значение и затем сохранить их в обратном порядке в хеш-таблице (т. е. ключ в хеш-таблице фактически является значением ресурса). и значение в хеш-таблице является ключом ресурса). Тогда перевод значения - & Gt; key будет быстрым. Единственная проблема заключается в том, как вы обрабатываете дубликаты (несколько ресурсов с одинаковым значением).

Это действительно не стоит вашего времени. У LINQ нет никаких средств для поиска вашего файла .resx более эффективно, чем вы могли бы. В зависимости от использования памяти и того, имеет ли смысл кэширование данных для вас, вам, вероятно, будет лучше прочитать весь файл в Dictionary<TKey,TValue> и выполнить поиск таким образом.

Конечно, вы можете создать свой собственный объект tuplet для хранения пары ключ / значение и прочитать весь файл в их список, а затем разрешить LINQ для объектов выполнять ваши запросы, но это не так быстрый как Dictionary и потребует больше накладных расходов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top