2009-06-03 6 views
1

Ma situation est que j'ai besoin d'obtenir une seule valeur qui définit la combinaison de plusieurs options de sélection. Voici un petit exemple de ce que je cherche à faire.Comment obtenir une valeur unique parmi plusieurs options sélectionnables?

Un utilisateur achète une chemise. Il existe de nombreuses options différentes que l'utilisateur peut sélectionner lors de l'achat de la chemise. Une seule option peut (et doit) être sélectionnée dans chaque groupe de sélection. Les groupes de sélection peuvent être représentés sous la forme d'une liste de boutons radio ou d'une liste déroulante, n'importe qui n'autorisant qu'une seule sélection pour chaque groupe. Par exemple:

Shirt Couleur: Rouge, Bleu, Vert, Noir, Blanc ou Jaune
shirt Taille: X-Petit, petit, moyen, grand, X-Large, XX-Large
Shirt Design: Horizontale À rayures, rayures verticales, pois, rayures diagonales, conception sans
chemise: bouton de chemise, polo, T-shirt à manches longues T-shirt, Sweat-shirt

donc qu'une seule option peut être sélectionnée dans chaque groupe pour le bien de ce problème. Je reçois un total de 900 variations différentes (6x6x5x5) en utilisant les sélections possibles. Étant donné que les options suivantes ont les valeurs suivantes:

rouge = 1, bleu = 2, vert = 3, noir = 4, blanc = 5, jaune = 6
X-Small = 0, petites = 1, Moyen = 2, Large = 3, X-Large = 4, XX-Large = 5
Rayures horizontales = 0, rayures verticales = 1, pois = 2, rayures diagonales = 3, sans motif = 4
Button Up Shirt = 0, Polo = 1, T-Shirt = 2, T-shirt à manches longues = 3, Sweat-shirt = 4

et qu'une sélection de {Rouge, X-Petit, rayures horizontales, chemise à boutons} = 1 et {Bleu, X-Small, rayures horizontales, chemise à boutons} = 2, etc,

Quelle est la bonne façon de trouver la valeur en fonction des sélections effectuées? Par exemple, quelle devrait être la valeur de sélection de {Black, Large, Horizontal Striped, T-Shirt} et comment trouver la solution? Je ne peux pas vraiment mettre le doigt dessus et tout ce que j'ai essayé semble avoir échoué. C'est probablement une solution simple et je suis juste mort de cerveau en ce moment.

Répondre

5

Vous pouvez concaténer les valeurs des options comme si elles étaient des chaînes (en convertissant chaque valeur à une chaîne, les concaténer, puis la convertir en un entier). Donc, {Black, Large, Horizontal Striped, T-Shirt} serait 4302. Cela devrait garantir que deux combinaisons possibles n'ont pas le même identifiant (bien que je ne sois pas un mathématicien).

+0

oui, c'est la voie à suivre pour ce que OP veut, c'est fréquemment utilisé pour encapsuler plusieurs options binaires en une seule valeur :-) – tekBlues

+0

Je savais qu'il y avait une réponse simple. Cela devrait bien faire. Merci! – Nate32

+0

N'a pas pensé à ça. Dans ma situation, je n'ai aucune option qui dépasse neuf, donc je ne pense pas que ce sera un problème. Encore c'est bon de connaître les limites. – Nate32

0

Avez-vous vraiment besoin d'une valeur numérique unique pour chaque combinaison d'options? Ou avez-vous juste besoin d'un moyen de regrouper la sélection de l'utilisateur dans une unité connue?

Si c'est le plus tard, je vous recommande de créer une classe Shirt, avec des propriétés pour chaque type de sélection (Couleur, Taille, Design et Type). Vous pourriez même avoir ces valeurs enum étant qu'il y a un nombre limité de valeurs pour chaque propriété.

Une fois que la sélection de l'utilisateur a été entièrement effectuée, vous pouvez vérifier les valeurs de chaque propriété de l'instance de Shirt pour savoir comment assembler la chemise finale.

+0

Oui, malheureusement, j'ai besoin d'une seule valeur numérique pour chaque combinaison. Je comprends que cela n'a pas beaucoup de sens à faire dans la situation que j'ai décrite, mais c'est un exemple très condensé pour illustrer ce que je cherche. – Nate32

+0

Puisqu'un numéro est nécessaire, je serais probablement d'accord avec la réponse de Matthew Jones, alors. – Andy

0

Faut-il absolument une valeur unique? Une collection de énumérations me semble le choix le plus logique:

ShirtColor Color; 
ShirtSize Size; 
ShirtPattern Pattern; 
ShirtType Type; 

enum ShirtColor {Red, Blue, Green, Black, White, Yellow}; 
... 

Si ça doit être une valeur unique, vous pourriez choisir un Int32, et utiliser chacun des drapeaux dans chaque octet de ce type int pour chacune des quatre pièces d'informations que vous souhaitez stocker. Utilisez un bitmask pour chacune des caractéristiques que vous extrayez.Quelque chose comme:

enum ShirtColor : byte {Red=0, Blue=1}; 
enum ShirtSize : byte {Small=0, Large=1}; 

int shirtInfo = 0x0001; 

int colorOffset = 0; 
int sizeOffset = 8; 

ShirtColor color = (ShirtColor)(shirtInfo << colorOffset); 
ShirtSize size = (ShirtSize)(shirtInfo << sizeOffset); 

Console.WriteLine(Enum.GetName(typeof(ShirtColor), color)); 
Console.WriteLine(Enum.GetName(typeof(ShirtSize), size)); 
1

Dans mon esprit, votre scénario cartes pour une classe Shirt avec 4 énumérations - Color, Size, Design et Type. La classe a des propriétés publiques qui exposent les membres privés du type des 4 enums.

Par conséquent, une instance de chemise peut avoir les 4 propriétés définies sans avoir à s'inquiéter de 900 combinaisons possibles. De plus, une seule instance de Chemise aura seulement une combinaison possible de chacune des propriétés. Vous pouvez interroger les types de valeurs définies de manière intuitive sans avoir à mémoriser quelle valeur entière correspond à quel type de propriété. C'est exactement ce que les Enums sont pour! façon ;-)

0

On est d'attribuer des plages de nombre de différentes grandeurs aux différents types d'informations:

Red = 1, Blue = 2, Green = 3, Black = 4, White = 5, Yellow = 6 
X-Small = 100, Small = 200, Medium = 300, Large = 400, X-Large = 500, XX-Large = 600 
Horizontal Striped = 1000, Vertical Stripes = 2000, Polka Dots = 3000, Diagonal Stripes = 4000, No Design = 5000 
Button Up Shirt = 10000, Polo Shirt = 20000, T-Shirt = 30000, Long Sleeve T-Shirt = 40000, Sweatshirt = 50000 

Ce qui voudrait dire que 42304 est un T-shirt à manches longues noir avec des rayures verticales de taille moyenne . Personnellement, je stockerais et traiterais probablement les différentes propriétés et les valeurs séparées à moins qu'il n'y ait des exigences spécifiques interdisant cela.

0

Couleur de la chemise: Rouge, Bleu, Vert, Noir, Blanc ou Jaune Taille de chemise: X-Small, Small, Medium, Large, X-Large, XX-Large Design de chemise: rayures horizontales, rayures verticales, Polka Dots, Rayures diagonales, No Design Type de t-shirt: Chemise boutonnée, Polo, T-Shirt, T-shirt à manche longue, Sweat-shirt

Notez ici vous avez 4 catégories, et chaque catégorie a une poignée de valeurs. Vous pouvez utiliser un entier de 4 octets et chaque octet pour une catégorie.

Ensuite, {Noir, Large, Rayures horizontales, T-Shirt} pourrait être la valeur (4 + 4 * 2^8 + 1 * 2^16 + 3 * 2^24).

Juste ne pense pas que la valeur est étroitement emballée, et vous le résoudre naturellement.

Questions connexes