C#中基于布尔模式的分支?

需要基于数组中16种不同布尔模式之一(为了在此消息中可读,0 == false和1 == true)而在C#(.NET 4.6.1)中进行分支:

   0000
   0010
   0100
   0110
   0001
   0011
   0101
   0111
   1000
   1010
   1100
   1110
   1001
   1011
   1101
   1111

不关心目前的整体表现,对于16个案例中的每一个案例来说,让分支可读的好方法是什么? 一些中间有“00”的人应该表现得一样,其他人则没有。

一个想法是将每个模式转换为一个字符串,然后做一个Switch或16“if”语句,这并不好。 每个模式都是BitArray的重要部分,被提取并投射到布尔数组中。


(单程)将你的四个bools转换为一个字节:

public byte BoolsToByte(IEnumerable<bool> bools)
{
    byte result = 0;
    foreach ( bool value in bools )
    {
        result *= 2;

        if ( value )
            result += 1;
    }

    return result;
}

public byte BoolsToByte(params bool[] bools)
{
    return BoolsToByte(bools.AsEnumerable());
}

超载可让您灵活地使用以下两种方式之一进行呼叫:

  • byte converted = BoolsToByte(bytes);
  • byte converted = BoolsToByte(a, b, c, d);

  • 我一直无法使用二进制字面值(使用Visual Studio 2015,面向.NET 4.6.1)。 nameof ,其他C#6.0功能还是像nameof工作一样。 现在我回到5.0行为,并留下二进制文件作为注释。

    如果您正在编译.NET 4.6.1,我假设您使用C#6.0功能,例如二进制文字,这将有助于提高可读性。 在这种情况下,你可以像这样使用switch语句的语法:

    switch ( converted )
    {
        case 0: // 0000
            // elided
            break;
        case 1: // 0001
        case 9: // 1001
            // elided
            break;
    
        // other cases elided
    
        case 15: // 1111
            // elided
            break;
    }
    

    注意我以1( 0001 )和9( 1001 )为例,因为你说过:

    一些中间有“00”的人应该表现得一样,其他人则没有。

    如果您不使用C#6.0功能,只需将二进制文字替换为注释中的数字等价物即可。

    链接地址: http://www.djcxy.com/p/63657.html

    上一篇: Branch in C# Based on Boolean Pattern?

    下一篇: Changing text in label make text align not working?