2009-03-17 6 views
3

je dois représenter une table de consultation en C#, voici la structure de base:meilleure façon de représenter cette table de recherche dans C#

Name Range Multiplier 

Active 10-20 0.5 

Qu'est-ce que vous les gars suggèrent?

Je devrai rechercher une plage et récupérer le multiplicateur. Je devrai également rechercher en utilisant le nom.

UPdate Il aura peut-être 10-15 lignes au total. La plage est un type de date entier.

+0

Quel est le type de données pour la plage? Souhaitez-vous rechercher par un int dans la gamme, ou seulement par la gamme elle-même? –

+0

La plage est un nombre entier. –

+0

Peut-être un 'Tuple'? – afaolek

Répondre

2

Parfois, la simplicité est la meilleure. Combien d'entrées regardons-nous, et les fourchettes sont-elles des nombres entiers comme vous semblez l'indiquer dans votre exemple? Bien qu'il existe plusieurs approches auxquelles je peux penser, la première qui me vient à l'esprit est de maintenir deux dictionnaires de recherche différents, un pour le nom et un pour la valeur (range), puis stocker simplement les informations redondantes dans le dictionnaire. Bien sûr, si votre gamme est composée de doubles, ou que votre gamme se chiffre en dizaines de milliers, je chercherais quelque chose de différent, mais la règle de simplicité est dans mon livre.

3

Créez une classe pour représenter chaque ligne. Il aurait les propriétés Name, RangeLow, RangeHigh et Multiplier. Créer une liste de ces lignes (lire à partir d'un fichier ou d'entrée dans le code), puis utiliser LINQ pour l'interroger:

from r in LookupTable 
where r.RangeLow <= x && r.RangeHigh >= x 
select r.Multiplier; 
+0

Corrigez-moi si je me trompe, mais n'est-ce pas une recherche linéaire? – Juliet

+0

Pour les objets O (10), la recherche linéaire sera probablement plus rapide que n'importe quel colombophile. – MarkusQ

+0

L'affiche dit "table de recherche", ce qui suggère un petit nombre de lignes. Évidemment, si un grand nombre de lignes sera présent, alors une forme d'index devrait être utilisée. –

4

Qu'est-ce que vous avez est en réalité deux tables de recherche: par son nom et un par Gamme. Il y a plusieurs façons de les représenter dans la mémoire en fonction de la taille de la table.

L'ajustement pour la plupart-probablement pour la recherche « par nom » est un dictionnaire:

var MultiplierByName = new Dictionary<string, double>() { {"Active",.5}, {"Other", 1.0} }; 

La gamme est plus délicate. Pour cela, vous voudrez probablement stocker uniquement l'élément minimum ou maximum, en fonction du fonctionnement de votre gamme. Vous pouvez également avoir besoin d'écrire une fonction pour réduire un entier donné à sa valeur de clé stockée correspondante (indice: utilisez la division entière ou l'opérateur mod). De là, vous pouvez choisir un autre dictionnaire (Dictionary<int, double>), ou si cela fonctionne correctement, vous pouvez faire en sorte que votre fonction de réduction retourne un int séquentiel et utilise un List<double> pour que votre 'clé' devienne juste un index. Mais comme je l'ai dit: pour savoir avec certitude ce qu'il y a de mieux, nous devons vraiment connaître la portée et la nature des données de la recherche, ainsi que le scénario que vous utiliserez pour y accéder.

1

Je voudrais implémenter cela en utilisant un DataTable, en supposant qu'il n'y avait aucune raison pressante d'utiliser un autre type de données. DataTable.Select fonctionnerait correctement pour exécuter une recherche sur Name ou Range. Vous perdez des performances en utilisant un DataTable pour cela, mais avec 10-15 enregistrements cela aurait-il autant d'importance.

Questions connexes