1

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

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

衬衫颜色:红色、蓝色、绿色、黑色、白色或黄色
衬衫尺码:X-Small、Small、Medium、Large、X-Large、XX-Large
衬衫设计:横条纹、竖条纹、圆点、斜条纹、无设计
衬衫类型:纽扣衬衫、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}的选择值应该是多少,你是怎么解决的?我不能完全把我的手指放在它身上,我尝试过的一切似乎都没有成功。这可能是一个简单的解决方案,我现在只是脑死亡。

4

6 回答 6

5

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

于 2009-06-03T17:26:18.963 回答
1

在我看来,您的场景映射到Shirt具有 4 个枚举的类- ColorSize和. 该类具有公开所有 4 个枚举类型的私有成员的公共属性。DesignType

因此,一个衬衫实例可以设置所有 4 个属性,而不必担心 900 种可能的组合。此外,一个单独的 Shirt 实例将仅具有每个属性的一种可能组合。您可以以直观的方式查询设置的值的类型,而无需记住哪个整数值映射到什么类型的属性。这正是枚举的用途!;-)

于 2009-06-03T17:35:09.310 回答
0

衬衫颜色:红色、蓝色、绿色、黑色、白色或黄色 衬衫尺码:X-Small、Small、Medium、Large、X-Large、XX-Large 衬衫设计:横条纹、竖条纹、圆点、斜条纹、无设计衬衫类型:纽扣衬衫、Polo 衫、T 恤、长袖 T 恤、运动衫

请注意,这里有 4 个类别,每个类别都有几个值。您可以使用一个 4 字节整数和一个类别的每个字节。

那么 {Black, Large, Horizo​​ntal Striped, T-Shirt} 可以是值 (4 + 4*2^8 + 1*2^16 + 3*2^24)。

只是不要认为值被挤得紧紧的,你自然会解决。

于 2009-06-03T18:20:37.720 回答
0

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

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

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

于 2009-06-03T17:24:49.323 回答
0

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

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

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

如果它必须是单个值,您可以选择一个 Int32,并为您要存储的四条信息中的每一条使用该 int 的每个字节中的每个标志。为您提取的每个特征使用位掩码。就像是:

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));
于 2009-06-03T17:25:56.777 回答
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 恤,中号竖条纹。

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

于 2009-06-03T17:38:56.867 回答