仅检查数组或列表中的特定布尔值

时间:2017-07-02 05:44:48

标签: c# boolean

 if (boolThing[0] == true 
        && boolThing[2] == true 
        && !boolThing[1] 
        && !boolThing[3] 
        && !boolThing[4])
    {
        Debug.Log("Hey");
    }

我想学习如何做到这一点的不同方法。

代码在0和3为真时执行,而其余为假。

是否有“更清洁”或“更有效”的方式来做到这一点?

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是否只包含特定值(truefalse)的元素:

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
}