LINQ to resx file?
-
05-07-2019 - |
Вопрос
Я пытаюсь найти способ получить ключ для данного фрагмента текста в указанном .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
и потребует больше накладных расходов.