if (boolThing[0] == true
&& boolThing[2] == true
&& !boolThing[1]
&& !boolThing[3]
&& !boolThing[4])
{
Debug.Log("Hey");
}
我想学习如何做到这一点的不同方法。
代码在0和3为真时执行,而其余为假。
是否有“更清洁”或“更有效”的方式来做到这一点?
答案 0 :(得分:2)
你可以这样做,Unity中的命名空间 System.Linq
if(boolThing.SequenceEqual(new bool[] { true, false, true, false, false})
{
Debug.Log("Hey");
}
答案 1 :(得分:1)
您不需要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个字节的数据,当你使用位询问布尔标志时,你可以在uint32中打包32个布尔值。
程序也会执行得更快,因为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];
关键是&#39;值&#39;如果bools [0] = true并且bools [3]为真,则为9。
所以你的代码应该干净利落:
if(value==9) // bools[0]&bools[1]==true;
您还可以创建常量掩码来检查不同的数值,以检查数值中是否设置了不同的位,或者使用二进制操作来操作位。
通过使用二进制操作设置数值,可以提高效率。
uint32 myFlag= 1|(1<<3);
答案 2 :(得分:0)
您可以将变量放在适当的列表中,然后测试每个List
是否只包含特定值(true
或false
)的元素:
List<bool> thingsTestedForTrue = new List<bool> { boolThing[0], boolThing[1], boolThing[2] };
List<bool> thingsTestedForFalse = new List<bool> { boolThing[3], boolThing[4], boolThing[5] };
if(thingsTestedForTrue.All(thing => thing == true) && thingsTestedForFalse.All(thing => thing == false)
{
// All values passed
}