2009-05-05 10 views
0

J'essaye de construire un moyen d'obtenir la clé pour un morceau de texte donné dans un fichier .resx donné à l'exécution.LINQ au fichier resx?

Actuellement, je peux ouvrir et lire le fichier (en utilisant ResXResourceReader) mais je dois utiliser un foreach pour parcourir tout le fichier.

Cela peut être un problème de performance, car certains de nos fichiers .resx sont assez volumineux (de l'ordre de 2000 chaînes) et nous le faisons fréquemment. Je voudrais utiliser LINQ to Objects pour interroger cela, car je suppose que la méthode where est relativement optimisée, mais je n'ai pas réussi à le faire. La classe ResXResourceReader a deux méthodes AsQueryable() et GetEnumerator(), mais aucune ne permet LINQ contre leur résultat (donc from n in reader.AsQueryable() where échoue).

Comment puis-je LINQ contre quelque chose fourni par le ResXResourceReader, ou vaut-il le coup?

Répondre

2

Le code suivant retourne un objet IEnumerable qui vous permet d'utiliser LINQ pour interroger le contenu d'un fichier de ressources:

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

Je l'ai accepté parce que cela fonctionne, et il ne plus répondre correctement à ma question immédiate . Je vais toutefois prendre en considération les autres réponses, et nous ne finirons peut-être pas par l'utiliser. – Jeff

1

Avez-vous envisagé de faire un peu de pré-traitement?

Vous pouvez charger le fichier Resx, puis une boucle sur les paires clé-valeur, puis les stocker inversée dans une table de hachage (la clé dans la table de hachage est en fait la valeur de la ressource, et la valeur dans la table de hachage est la clé de la ressource). Alors les traductions de value-> key seraient rapides. La seule préoccupation est comment vous gérez les doublons (ressources multiples avec la même valeur).

1

Cela ne vaut pas vraiment votre temps. LINQ n'a aucun moyen de rechercher votre fichier .resx plus efficacement que vous pourriez. Selon l'utilisation de la mémoire et si la mise en cache des données a du sens pour vous, il serait probablement préférable de lire le fichier entier dans un Dictionary<TKey,TValue> et de faire ainsi vos recherches. Vous pouvez, bien sûr, créer votre propre objet de tuplet pour stocker une paire clé/valeur et lire dans le fichier entier dans une liste de ceux-ci, puis autoriser LINQ aux objets à faire votre requête, mais ce ne sera pas aussi vite qu'un Dictionary et nécessiterait plus de frais généraux.

Questions connexes