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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top