LINQ para resx?
-
05-07-2019 - |
Pergunta
Eu estou tentando construir uma maneira de obter a chave para um determinado pedaço de texto em um determinado arquivo .resx
em tempo de execução.
Atualmente, eu posso abrir e ler o arquivo (usando ResXResourceReader
), mas eu tenho que usar um foreach
passar por cima de todo o arquivo.
Este poderia ser um problema de desempenho, como alguns de nossos arquivos .resx
são bastante grande (na ordem dos 2000 cordas) e nós pode estar fazendo isso com freqüência.
Eu gostaria de usar o LINQ to Objects para consultar este, como eu suponho que o método where
é relativamente otimizado, porém eu fui incapaz de fazê-lo. A classe ResXResourceReader
tem dois métodos AsQueryable()
e GetEnumerator()
, mas também não permitem LINQ contra o seu resultado (tão from n in reader.AsQueryable() where
falhar).
Como posso LINQ contra algo fornecido pelo ResXResourceReader
, ou é mesmo a pena o tempo?
Solução
O código a seguir retorna um objeto IEnumerable que lhe permite usar LINQ para consultar o conteúdo de um arquivo de recurso:
ResXResourceReader reader = new ResXResourceReader(myfile);
IEnumerable<DictionaryEntry> enumerator = reader.OfType<DictionaryEntry>();
Outras dicas
Você considerou apenas fazendo alguns pré-processamento?
Você pode carregar o arquivo Resx, então loop sobre os pares chave-valor, e depois armazená-los revertida em uma tabela hash (ou seja, a chave na tabela hash é realmente o valor do recurso e o valor na tabela hash é a chave do recurso). Em seguida, as traduções de valor-> chave seria rápido. A única preocupação é como você lida com duplicados (vários recursos com o mesmo valor).
Isto não é realmente vale o seu tempo. LINQ não tem nenhum meio de pesquisar o arquivo .resx mais eficiente do que poderia. Dependendo do uso de memória e se ou não o cache de dados faz sentido para você, você provavelmente seria melhor ler o arquivo inteiro em um Dictionary<TKey,TValue>
e fazer suas pesquisas dessa forma.
Você poderia, é claro, criar seu próprio objeto tuplet para armazenar um par chave / valor e lido em todo o arquivo em uma lista dessas, em seguida, permitir LINQ a objetos para fazer a sua consulta, mas isso não será tão rápido como um Dictionary
e exigiria mais sobrecarga.