0

我正在开发具有某些类别的应用程序。目的是将类别存储在一个值中。
首先,我选择将它们存储在一个 int 中。
Categories : 0, 1, 2, 3...
然后我做一个位掩码操作来查找选择了哪个类别。
但问题是我不能存储超过 31 个类别是这个 int。

有没有办法制作这样的系统?我不想抛出无限数量的类别,但可能超过 64 个
。目标语言是 C#,但任何其他解决方案都可以。

非常感谢 !

4

4 回答 4

2

考虑使用System.Collections.BitArray,它是一个任意长度的位数组。您可以进行交集 (AND)、并集 (OR) 和补集 (NOT)。

您现在可以拥有超过 32 个以整数为键的类别:

public static class Categories
{
   public const int Category1 = 1;
   public const int Category2 = 2;
    //...
   public const int Category3123 = 3123;
   public const int Max = 5000;
}

BitArray myBitset = new BitArray((int)Categories.Max);
myBitSet.Set(Categories.Category1);
myBitSet.Set(Categories.Category4);

我使用 int 而不是枚举来避免在使用 BitArray 时需要对 int 进行所有强制转换,但显然您可以将它们封装在一个处理类别的类中。

于 2013-02-26T10:53:10.670 回答
1

我不确定我是否正确理解了您的问题,所以这里有 2 个答案:

如果您想对一个对象进行分类,但它一次只能保存一个类别,您可以完美地选择将类别编号存储在 int 中 - 无需位掩码。

如果您想存储对于给定对象应该全部为真或假的不同标志/类别/选项,那么您应该使用更长的位掩码。一个布尔数组是个好主意 - 不需要做位操作来获取和设置值,我很确定编译器会最好地优化空间使用(你知道一个布尔变量实际上是一个字节,但我假设如果你创建了许多布尔变量,它们实际上会被塞进尽可能少的空间。)无论如何,你总是可以选择你自己的实现长,它是 64 位,甚至是 BigInteger - 无限位数,你最初必须将其设置为 1*10^x 其中 x 是您想要访问的最大位位置的数量。

于 2013-02-26T11:00:50.777 回答
0

如果您这样定义类别:

public enum Categories
{
    Category1 = 0x0001,
    Category2 = 0x0002,
    Category3 = 0x0004,
    Category4 = 0x0008,
    Category5 = 0x000F,
    Category6 = 0x0010,
    Category7 = 0x0020,
    Category8 = 0x0040,
    // etc...
}

然后你可以像这样使用它们:

var myCategories = Categories.Category1 | Categories.Category4;

if(myCategories | Categories.Category1 > 0)
{
    // do something for category 1....
}
于 2013-02-26T10:58:52.773 回答
0

你为什么在这里使用位掩码?存储效率是否存在首要问题?否则,只需使用HashSet您的类别。

从概念上讲,位集和常规集容器是相同的,位集只是具有特殊性能特征的特定实现。

于 2013-02-26T11:04:44.623 回答