您不需要if(boolThing[0]==true)。您可以只使用 `if (boolThing[0]))
您还可以使用二元运算符来同时计算多个布尔值。
if((bools[0]&bools[3]) && !(bools[1]|bools[2]|bools[4]|bools[5])
您可以使用BitArray 轻松处理布尔值集合,这样效率会更高。
最有效的方法是使用数字类型。
最简单的方法是使用带有标志的枚举。您可以使用二元运算符来设置或清除枚举的标志。
[Flags]
public enum MyBoolFlag
{
None,
Bool0 = 1<<0,
Bool1 = 1 << 1,
Bool2 = 1 << 2,
Bool3 = 1 << 3,
Bool4 = 1 << 4,
Bool5 = 1 << 5,
//etc
}
你使用二进制操作来设置标志。
MyBoolFlag myFlag = MyBoolFlag.Bool0|MyBoolFlag.Bool1|MyBoolFlag.Bool3;
在您的代码中,您现在可以检查:
if(myFlag == MyBoolFlag.Bool0|MyBoolFlag.Bool3)
{
}
您可以为各种条件定义常量。
const MyBoolFlag myCondition1 = MyBoolFlag.Bool0|MyBoolFlag.Bool3;
然后检查:
if(myFlag == myCondition1)
{
}
你也可以做一些额外的工作,直接使用原生类型,比如 byte 和 int。
您可以使用单个字节将 8 个布尔值保存为标志掩码,每个掩码代表 2 的幂。一个 uint32 可以保存 32 个,一个 uint64 可以保存 64 个布尔值。
这具有巨大的性能提升,因为布尔值存储为 uint32,这意味着它使用 4 个字节的数据,并且当您使用位询问布尔标志时,您可以将 32 个布尔值打包到一个 uint32 中。
程序也将执行得更快,因为 CPU 使用本地机器字在单个操作中评估 myFlag == myCondition1。否则需要许多指令来将查找布尔值放入数组中并进行比较。 .Net 还会进行一些完整性检查,确保您的数组不为空,索引不超出范围,然后需要移动指针以查找这些值。
为方便起见,您可以从布尔数组创建位数组,然后使用它来初始化数值类型数组并设置相应的标志。
例如:
bool[] bools = new bool[] { true, false, false, true, false, false };
BitArray bitArray = new BitArray(new bool[] { true, false, false, true, false, false });
int[] array = new int[1];
bitArray.CopyTo(array, 0);
int value = array[0];
如果 bools[0] = true 且 bools[3] true,则“值”将是 9。
所以你的代码应该是:
if(value==9) // bools[0]&bools[1]==true;
您还可以创建常量掩码来检查不同的数值,以检查您的数值中是否设置了不同的位或使用二进制运算来操作位。
使用二元运算设置数值可以提高效率。
uint32 myFlag= 1|(1<<3);