LINQ au fichier resx?
-
05-07-2019 - |
Question
J'essaie de créer un moyen d'obtenir la clé d'un texte donné dans un fichier .resx
donné à l'exécution.
Actuellement, je peux ouvrir et lire le fichier (Utiliser ResXResourceReader
), mais je dois utiliser un foreach
pour parcourir l'intégralité du fichier.
Cela pourrait être un problème de performances, car certains de nos where
fichiers sont assez volumineux (de l'ordre de 2000 chaînes) et que cela se produit fréquemment.
J'aimerais utiliser LINQ to Objects pour interroger ceci, car je suppose que la méthode AsQueryable()
est relativement optimisée, mais je n'ai pas pu le faire. La classe GetEnumerator()
a deux méthodes from n in reader.AsQueryable() where
et <=>, mais n'autorise pas LINQ contre leur résultat (donc <=> échoue).
Comment puis-je LINQ contre quelque chose fourni par <=>, ou vaut-il même la peine?
La solution
Le code suivant renvoie 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>();
Autres conseils
Avez-vous envisagé de procéder à un prétraitement?
Vous pouvez charger le fichier Resx, puis passer en boucle sur les paires clé-valeur, puis les stocker inversées dans une table de hachage (la clé de la table de hachage est en réalité la valeur de la ressource et la valeur dans la table de hachage est la clé de la ressource). Ensuite, les traductions de valeur - & Gt; key seraient rapides. La seule préoccupation concerne la manière dont vous gérez les doublons (plusieurs ressources avec la même valeur).
Cela ne vaut pas vraiment votre temps. LINQ n'a aucun moyen de rechercher votre fichier .resx plus efficacement que vous ne le pourriez. En fonction de l'utilisation de la mémoire et de la pertinence de la mise en cache des données, il serait probablement préférable de lire l'intégralité du fichier dans un fichier Dictionary<TKey,TValue>
et de procéder de cette façon à votre recherche.
Vous pouvez, bien sûr, créer votre propre objet multiplet pour stocker une paire clé / valeur et lire le fichier entier dans une liste, puis autoriser LINQ aux objets à effectuer votre interrogation, mais ce ne sera pas rapide comme Dictionary
et nécessiterait davantage de temps système.