我正在开发具有某些类别的应用程序。目的是将类别存储在一个值中。
首先,我选择将它们存储在一个 int 中。
Categories : 0, 1, 2, 3...
然后我做一个位掩码操作来查找选择了哪个类别。
但问题是我不能存储超过 31 个类别是这个 int。
有没有办法制作这样的系统?我不想抛出无限数量的类别,但可能超过 64 个
。目标语言是 C#,但任何其他解决方案都可以。
非常感谢 !
我正在开发具有某些类别的应用程序。目的是将类别存储在一个值中。
首先,我选择将它们存储在一个 int 中。
Categories : 0, 1, 2, 3...
然后我做一个位掩码操作来查找选择了哪个类别。
但问题是我不能存储超过 31 个类别是这个 int。
有没有办法制作这样的系统?我不想抛出无限数量的类别,但可能超过 64 个
。目标语言是 C#,但任何其他解决方案都可以。
非常感谢 !
考虑使用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 进行所有强制转换,但显然您可以将它们封装在一个处理类别的类中。
我不确定我是否正确理解了您的问题,所以这里有 2 个答案:
如果您想对一个对象进行分类,但它一次只能保存一个类别,您可以完美地选择将类别编号存储在 int 中 - 无需位掩码。
如果您想存储对于给定对象应该全部为真或假的不同标志/类别/选项,那么您应该使用更长的位掩码。一个布尔数组是个好主意 - 不需要做位操作来获取和设置值,我很确定编译器会最好地优化空间使用(你知道一个布尔变量实际上是一个字节,但我假设如果你创建了许多布尔变量,它们实际上会被塞进尽可能少的空间。)无论如何,你总是可以选择你自己的实现长,它是 64 位,甚至是 BigInteger - 无限位数,你最初必须将其设置为 1*10^x 其中 x 是您想要访问的最大位位置的数量。
如果您这样定义类别:
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....
}
你为什么在这里使用位掩码?存储效率是否存在首要问题?否则,只需使用HashSet
您的类别。
从概念上讲,位集和常规集容器是相同的,位集只是具有特殊性能特征的特定实现。