2009-03-10 6 views
0

J'ai une classe dans mon application qui traduit les jetons de chemin en chemins complets. Par exemple: il peut prendre une chaîne comme "%MYAPPDATA%" et renvoyer C:\Users\user.DOMAIN\AppData\Raoming\MyApp.Devrais-je conserver les données de cette application?

Alternativement, la classe a une surcharge à la fonction qui peut prendre une énumération au lieu d'une chaîne. Par exemple: il peut prendre l'enum AppPaths.MyAppData et renvoyer C:\Users\user.DOMAIN\AppData\Raoming\MyApp.

J'ai besoin de stocker la "table de recherche" quelque part, mais je ne suis pas sûr de la meilleure méthode ou structure. Dois-je utiliser un ensemble de données et écrire la table sur le disque? Ou juste garder en mémoire?

Une valeur de chemin unique peut correspondre à une chaîne et à une énumération. Je suppose que je peux juste garder un tableau en mémoire dont l'index correspond à la valeur entière de l'enum et faire une recherche dans le tableau quand on me passe une chaîne.

Pensées?

Répondre

2

Sauf si elle est particulièrement grande, je voudrais simplement aller avec la matrice en mémoire. Pour un peu plus de fonctionnalités - et un peu plus de frais généraux - vous pouvez utiliser une liste ou un dictionnaire. Pour beaucoup de fonctionnalités - mais beaucoup de frais généraux - vous pouvez utiliser un ensemble de données en mémoire. Encore une fois, sauf si vous avez plus de 250 à 500 éléments, cela n'a aucun sens d'utiliser le stockage sur disque pendant le fonctionnement de votre programme: le temps de latence (temps de récupération) et le codage ça ne vaut pas le coup.

Vous pouvez, bien sûr, conserver des enregistrements sur disque en tant que stockage à long terme (par exemple, à charger au démarrage du programme). Cependant, votre problème semble indiquer que vous n'en aurez peut-être même pas besoin si vous extrayez les données du système d'exploitation.

+0

je devrais construire le tableau lorsque l'objet est construit alors? –

+0

Oui, c'est l'approche que je prendrais. Si vous ne voulez pas écrire le code pour rechercher des correspondances, examinez le type Liste ou, mieux encore, la version générique de Dictionary. Vous aurez toujours besoin d'une fonction pour faire des comparaisons, mais elles sont assez faciles. –

+0

Encore une question - le traducteur est une sorte d'utilitaire donc je l'ai fait construire comme une classe statique qui avait une grande déclaration de cas. Maintenant que je dois garder la table de recherche en mémoire, devrais-je rendre l'état partagé de la table ou rendre la classe non statique? –

1

Tout dépend de la performance que vous désirez.

Vous pouvez stocker les données dans les tables de base de données (une pour les données « brutes », deux pour la relation entre les touches et l'énumération) et le chercher avec de simples requêtes SQL. Toutefois, cela peut ne pas être le moyen le plus rapide, en fonction de la base de données sous-jacente et du mécanisme de mise en cache.

Vous pouvez également utiliser deux mappes en mémoire (dictionnaires?) Pour une recherche plus rapide au moment de l'exécution, en les initialisant au démarrage.

0

Je le garderais en mémoire s'il est impossible qu'il grandisse - sinon je le stockerais dans une base de données/fichier pour une utilisation ultérieure.

Bien sûr, cela dépend de votre utilisation. Autant que je vois, vous voulez stocker le chemin d'accès aux données spécifiques à l'utilisateur. Se pourrait-il que vous ayez une User-Class où vous pouvez stocker le chemin des données?

if(Directory.Exists(User.Current.AppDataPath)) 

Ainsi, vous pouvez probablement vous débarrasser de la « table de consultation » puisque chaque utilisateur sait où son AppData est - juste une pensée ...

Questions connexes