如何从多个可选选项中获取单个值?

时间:2009-06-03 17:19:03

标签: c# options

我的情况是我需要获得一个定义多个选择选项组合的值。这是我想要做的一个小例子。

用户正在买衬衫。购买衬衫时,用户可以选择许多不同的选项。每个选择组只能(且必须)选择一个选项。选择组可以表示为单选按钮列表或下拉列表,任何只允许每个组选择一个的选项。例如:

衬衫颜色:红色,蓝色,绿色,黑色,白色或黄色
衬衫尺寸:X-小​​,小,中,大,X-大,XX-大
衬衫设计:水平条纹,垂直条纹,波尔卡圆点,斜条纹,无设计
衬衫类型:系扣衬衫,Polo衫,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,Polo衫= 1,T恤= 2,长袖T恤= 3,运动衫= 4

选择{Red,X-Small,Horizo​​ntal Striped,Button Up Shirt} = 1和{Blue,X-Small,Horizo​​ntal Striped,Button Up Shirt} = 2等,

根据所做的选择找到值的正确方法是什么?例如,{Black,Large,Horizo​​ntal Striped,T-Shirt}的选择值应该是什么?您如何找到解决方案?我不能完全指责它,我尝试过的所有东西似乎都没有成功。这可能是一个简单的解决方案,我现在只是大脑死了。

6 个答案:

答案 0 :(得分:5)

您可以将选项的值连接起来,就像它们是字符串一样(通过将每个单独的值转换为字符串,将它们连接起来,然后将其转换为整数)。所以,{Black,Large,Horizo​​ntal Striped,T-Shirt}将是4302.这应该保证没有两种可能的组合具有相同的标识符(尽管我不是数学专家)。

答案 1 :(得分:1)

在我看来,您的方案映射到包含4个枚举的Shirt课程 - ColorSizeDesignType。该类具有公共属性,可以公开所有4个枚举类型的私有成员。

因此,一个衬衫实例可以设置所有4个属性,而不必担心900种可能的组合。此外,一个衬衫实例只有每个属性的一个可能组合。您可以直观地查询设置的值类型,而无需记住哪个整数值映射到哪种类型的属性。这正是Enums的用途! ; - )

答案 2 :(得分:0)

对于每个选项组合,您真的需要一个单一的数值吗?或者您只是需要某种方法将用户的选择分组到一个已知单位?

如果是后者,我建议创建一个Shirt类,其中包含每种选择类型(颜色,大小,设计和类型)的属性。您甚至可以将这些作为枚举值,因为每个属性的值都有限。

完成用户的选择后,您可以检查Shirt实例的每个属性的值,以了解如何将最终衬衫放在一起。

答案 3 :(得分:0)

它绝对必须是单一价值吗?一系列枚举让我觉得是最合乎逻辑的选择:

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

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

如果它必须是单个值,您可以选择一个Int32,并使用该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));

答案 4 :(得分:0)

一种方法是将不同大小的数字范围分配给不同类型的信息:

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

这意味着42304是一款黑色长袖T恤,中等大小的垂直条纹。

就个人而言,除非有特殊要求禁止,否则我可能会存储和处理不同的属性和单独的值。

答案 5 :(得分:0)

衬衫颜色:红色,蓝色,绿色,黑色,白色或黄色 衬衫尺寸:X-小​​,小,中,大,X大,XX大 衬衫设计:水平条纹,垂直条纹,波尔卡圆点,斜条纹,无设计 衬衫类型:系扣衬衫,Polo衫,T恤,长袖T恤,运动衫

请注意,此处有4个类别,每个类别都有少量值。您可以使用4字节整数和每个字节作为类别。

然后{黑色,大号,水平条纹,T恤}可能是值(4 + 4 * 2 ^ 8 + 1 * 2 ^ 16 + 3 * 2 ^ 24)。

只是不要认为价值紧密,你会自然地解决它。