2009-06-03 7 views
1

私の状況は、複数の選択オプションの組み合わせを定義する単一の値を取得する必要があるということです。ここでは私が探しているものの小さな例があります。複数の選択可能なオプションから単一の値を取得する方法は?

ユーザーがシャツを購入しています。ユーザーがシャツを購入するときに選択できる多くの異なるオプションがあります。各選択グループから選択できるオプションは1つだけです(また、選択する必要があります)。選択グループは、ラジオボタンリストまたはドロップダウンリストとして表すことができ、グループごとに1つの選択のみが可能なanythignです。たとえば、次のように

シャツカラー:レッド、ブルー、グリーン、ブラック、ホワイト、またはイエロー
シャツのサイズ:X-小、小、中、大、X-大、XX-大
シャツデザイン:水平ストライプ、縦縞、ポルカドット、斜めのストライプ、ノーデザイン
シャツタイプ:ボタンアップシャツ、ポロシャツ、Tシャツ、長袖Tシャツ、トレーナー

だから唯一のオプションは、各グループから選択することができますこの問題のために。私は可能な選択肢を使って、合計900の異なるバリエーション(6x6x5x5)を取得します。

赤= 1、青= 2、緑= 3、黒= 4、白= 5、黄色= 6
X-Small = 0、Small = 1、Medium = 2、Large = 3、X-Large = 4、XX-Large = 5
横縞= 0、縦縞= 1、縦縞= 2、斜め縞= 3、デザインなし= 4
ボタンアップシャツ= 0、ポロシャツ= 1、Tシャツ= 2、長袖Tシャツ= 3、スエットシャツ= 4

、{赤、X-スモール、横縞、ボタンアップシャツ} {青、X-スモール、横縞、ボタンアップシャツ} = 2など

選択内容に基づいて値を見つける正しい方法は何ですか?たとえば、{Black、Large、Horizo​​ntal Striped、T-Shirt}の選択値はどのようになりますか、どのように解決策に来るでしょうか?私はそれにかなり私の指を置くことはできませんし、私が試したことがすべて失敗したようだ。それはおそらく単純な解決策であり、私はちょうど脳死です。

答えて

5

:ような何か。つまり、{黒、大、横縞、Tシャツ}は4302になります。これにより、2つの可能な組合せが同じ識別子を持つことは保証されません(私は数学者ではありません)。 ColorSizeDesignType - 私の心の中で

+0

はい、それはOPが望んでいるものに行く方法です、これは頻繁に複数のバイナリオプションを1つの値にカプセル化するために使用されます:-) – tekBlues

+0

私は単純な答えがあることを知っていました。これはうまくいくはずです。ありがとう! – Nate32

+0

それは考えていませんでした。私の状況では、私はそれが問題になるとは思わないので、9を過ぎるオプションはありません。まだ制限を知って良いです。 – Nate32

0

オプションの組み合わせごとに1つの数値が本当に必要ですか?または、ユーザーの選択を既知の単位にグループ化するための何らかの方法が必要ですか?

これが後であれば、各選択タイプ(色、サイズ、デザイン、タイプ)のプロパティを持つShirtクラスを作成することをおすすめします。各プロパティの値の数が限られているため、これらの列挙型の値を使用することもできます。

ユーザーの選択が完全に完了したら、Shirtのインスタンスの各プロパティの値をチェックして、最終的なシャツをまとめる方法を知ることができます。

+0

はい残念ながら、私は各組み合わせに対して1つの数値が必要です。私は説明した状況ではそれが意味をなさないことを理解していますが、私が探しているものを説明するための非常に凝縮された例です。 – Nate32

+0

1つの番号が必要なので、私はおそらくMatthew Jonesの答えに行くでしょう。 – Andy

0

絶対に1つの値にする必要はありますか?列挙型のコレクションは、最も論理的な選択として私を打つ:

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

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

単一の値であることを持っている場合は、あなたがのInt32を選ぶと、4個のそれぞれについて、そのint型の各バイトの各フラグを使用する場合がありますあなたが保存したい情報の抽出する特性ごとにbitmaskを使用してください。彼らは(整数にそれを変換し、その後、それらを連結し、文字列に個々の値を変換することによって)文字列だったようにあなたは、オプションの値を連結でき

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

は、あなたのシナリオでは、4つの列挙型でShirtクラスにマッピングします。クラスには、4つの列挙型すべてのタイプのプライベートメンバーを公開するパブリックプロパティがあります。

したがって、1つのシャツインスタンスは、約900の可能な組み合わせを心配することなく、4つのプロパティすべてを設定できます。さらに、1つのシャツインスタンスには、それぞれのプロパティの可能な組み合わせが1つしかありません。どのような整数値がどのタイプのプロパティにマップされているかを覚えなくても、直感的に設定された値のタイプを照会することができます。これは正確にEnumsのためのものです! ;-)

0

一つの方法は、異なる種類の情報に異なる大きさの番号範囲を割り当てることです:42304サイズ媒体の縦のストライプと黒の長袖Tシャツであることを意味する

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 

個人的に私はおそらく、違うプロパティと値を別々の値として扱い、それを禁止する特定の要件がない限り、扱います。

0

シャツカラー:レッド、ブルー、グリーン、ブラック、ホワイト、またはイエロー シャツのサイズ:X-小、小、中、大、X-大、XX-大 シャツデザイン:水平ストライプ、縦縞、ポロシャツ、斜めストライプ、デザインなし シャツタイプ:ボタンアップシャツ、ポロシャツ、Tシャツ、長袖Tシャツ、スウェットシャツ

ここには4つのカテゴリがあり、各カテゴリにはいくつかの価値があります。カテゴリには4バイトの整数と各バイトを使用できます。

{黒、大、横縞、Tシャツ}は(4 + 4 * 2^8 + 1 * 2^16 + 3 * 2^24)の値になります。

値がきつく詰まっているとは思わないので、自然に解決します。

関連する問題