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