2009-06-03 7 views
1

Meine Situation ist, dass ich einen einzelnen Wert erhalten muss, der die Kombination mehrerer Auswahloptionen definiert. Hier ist ein kleines Beispiel dafür, was ich machen möchte.Wie erhält man einen einzelnen Wert aus mehreren auswählbaren Optionen?

Ein Benutzer kauft ein Hemd. Es gibt viele verschiedene Optionen, die der Benutzer beim Kauf des Shirts auswählen kann. Nur eine Option kann (und muss) aus jeder Auswahlgruppe ausgewählt werden. Die Auswahlgruppen können als Auswahlliste oder Auswahlliste dargestellt werden, die nur eine Auswahl für jede Gruppe erlaubt. Zum Beispiel:

Shirt Farbe: Rot, Blau, Grün, Schwarz, Weiß oder Gelb
Shirt Größe: X-Small, Small, Medium, Large, X-Large, XX-Large
Shirt Motiv: Horizontal Gestreift, vertikale Streifen, Tupfen, diagonale Streifen, kein Entwurf
Hemd Art: Knopf-Up shirt, Polohemd, T-shirt, T-shirt, Sweatshirt

So nur eine Option kann aus jeder Gruppe ausgewählt werden wegen dieses Problems. Ich erhalte insgesamt 900 verschiedene Varianten (6x6x5x5) mit den möglichen Auswahlen. In Anbetracht, dass die folgenden Optionen haben folgende Werte:

Rot = 1, Blau = 2, Grün = 3, Schwarz = 4, Weiß = 5, Gelb = 6
X-Small = 0, Klein = 1, Medium = 2, Groß = 3, X-Groß = 4, XX-Groß = 5
Horizontal Striped = 0, Vertikale Streifen = 1, Tupfen = 2, Diagonale Streifen = 3, Kein Design = 4
Button Up Shirt = 0, Polo-Shirt = 1, T-Shirt = 2, Langarm-T-Shirt = 3, Sweatshirt = 4

und dass eine Auswahl von {Red, X-Small, horizontal gestreift, Button Up Shirt} = 1 und {Blau, X-Klein, Horizontal gestreift, Button-Up-Hemd} = 2 usw.,

Was ist der richtige Weg, um den Wert basierend auf der getroffenen Auswahl zu finden? Was soll zum Beispiel der Auswahlwert {Black, Large, Horizontal Striped, T-Shirt} sein und wie kommst du zur Lösung? Ich kann es nicht genau sagen und alles, was ich versucht habe, scheint erfolglos zu sein. Es ist wahrscheinlich eine einfache Lösung und ich bin gerade hirntot.

Antwort

5

Sie könnten die Werte der Optionen verketten wie sie Strings waren (durch jeden einzelnen Wert in einen String konvertieren, verketten sie, dann ist das auf eine ganze Zahl konvertieren). Also wäre {Black, Large, Horizontal Striped, T-Shirt} 4302. Dies sollte garantieren, dass keine zwei möglichen Kombinationen die gleiche Kennung haben (obwohl ich kein Mathe-Whiz bin).

+0

Ja, das ist der Weg für was OP will, das wird häufig verwendet, um mehrere binäre Optionen in einen Wert zu kapseln :-) – tekBlues

+0

Ich wusste, dass es eine einfache Antwort gab. Dies sollte gut tun. Vielen Dank! – Nate32

+0

Ich habe nicht daran gedacht. In meiner Situation habe ich keine Option, die über 9 hinausgeht, also denke ich nicht, dass es ein Problem sein wird. Trotzdem ist es gut, die Grenzen zu kennen. – Nate32

0

Benötigen Sie wirklich einen einzelnen numerischen Wert für jede Kombination von Optionen? Oder brauchen Sie nur eine Möglichkeit, die Auswahl des Benutzers in eine bekannte Einheit zu gruppieren?

Wenn es das spätere ist, würde ich empfehlen, eine Shirt Klasse mit Eigenschaften für jeden Auswahltyp (Farbe, Größe, Design und Typ) zu erstellen. Sie könnten sogar diese enum-Werte haben, da für jede Eigenschaft eine begrenzte Anzahl von Werten existiert.

Sobald die Auswahl des Benutzers vollständig getroffen wurde, können Sie die Werte jeder Eigenschaft der Instanz Shirt überprüfen, um zu wissen, wie das endgültige Hemd zusammengelegt wird.

+0

Ja, leider brauche ich für jede Kombination einen einzigen numerischen Wert. Ich verstehe, dass es in der von mir beschriebenen Situation nicht viel Sinn macht, aber es ist ein sehr komprimiertes Beispiel, um zu illustrieren, wonach ich suche. – Nate32

+0

Da eine Nummer erforderlich ist, würde ich wahrscheinlich mit Matthew Jones 'Antwort gehen. – Andy

0

Muss es unbedingt ein einzelner Wert sein? Eine Sammlung von Aufzählungen scheint mich die logischste Wahl:

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

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

Wenn es hat hat einen einzigen Wert sein, könnten Sie einen Int32 holen, und jede Flagge für jedes der vier Stücke in jedem Byte des int verwenden von Informationen, die Sie speichern möchten. Verwenden Sie für jedes der Merkmale, die Sie extrahieren, eine bitmask.Etwas wie:

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

In meinem Kopf Karten Ihr Szenario eine Shirt Klasse mit 4 Aufzählungen - Color, Size, Design und Type. Die Klasse verfügt über öffentliche Eigenschaften, die private Elemente des Typs aller 4 Enums verfügbar machen.

Daher kann eine Shirt-Instanz alle 4 Eigenschaften festlegen, ohne sich um 900 mögliche Kombinationen kümmern zu müssen. Zusätzlich hat eine einzelne Shirt-Instanz nur eine mögliche Kombination der einzelnen Eigenschaften. Sie können die Typen von Werten auf intuitive Weise abfragen, ohne sich merken zu müssen, welcher Integer-Wert welcher Eigenschaftstyp zugeordnet ist. Genau dafür sind Enums da! ;-)

0

Eine Möglichkeit ist, Nummernbereiche verschiedener Größen auf die verschiedenen Arten von Informationen zuweisen:

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 

was bedeuten würde, dass 42304 ein schwarzes T-Shirt mit der vertikalen Streifen in der Größe Medium .

Persönlich würde ich wahrscheinlich die verschiedenen Eigenschaften speichern und behandeln und separate Werte, es sei denn, es gab spezielle Anforderungen, die das verbieten.

0

Shirt Farbe: Rot, Blau, Grün, Schwarz, Weiß oder Gelb Shirt Größe: X-Small, Small, Medium, Groß, X-Large, XX-Large Shirt-Design: Horizontal gestreift, Vertikale Streifen, Tupfen, diagonale Streifen, kein Entwurf Hemd-Art: Knopf-oben Hemd, Polo-Hemd, T-Shirt, langes Hülsen-T-Shirt, Sweatshirt

Anmerkung hier haben Sie 4 Kategorien und jede Kategorie hat eine Handvoll Werte. Sie können eine 4-Byte-Ganzzahl und jedes Byte für eine Kategorie verwenden.

Dann könnte {schwarz, groß, horizontal gestreift, T-Shirt} der Wert sein (4 + 4 * 2^8 + 1 * 2^16 + 3 * 2^24).

Denken Sie einfach nicht, der Wert ist dicht gepackt, und Sie werden es natürlich lösen.