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

C# 基于布尔模式的C语言分支?,c#,switch-statement,pattern-matching,bitarray,C#,Switch Statement,Pattern Matching,Bitarray,需要根据数组中16种不同的布尔模式之一在C.NET 4.6.1中进行分支,以确保此消息的可读性,0==false和1==true: 0000 0010 0100 0110 0001 0011 0101 0111 1000 1010 1100 1110 1001 1011 1101 1111 此时不考虑整体性能,对于16种情况中的每一种,让分支的人类可读的好方法是什么?有些中间有00的人应该表现相同,

需要根据数组中16种不同的布尔模式之一在C.NET 4.6.1中进行分支,以确保此消息的可读性,0==false和1==true:

   0000
   0010
   0100
   0110
   0001
   0011
   0101
   0111
   1000
   1010
   1100
   1110
   1001
   1011
   1101
   1111
此时不考虑整体性能,对于16种情况中的每一种,让分支的人类可读的好方法是什么?有些中间有00的人应该表现相同,而其他人则不一样。


一个想法是将每个模式转换成一个字符串,然后执行Switch或16 if语句,这不太好。每个模式都是位数组的重要部分,提取并转换为布尔数组。

将四个布尔值转换为一个字节的一种方法:

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());
}
请注意,我将10001和91001合并为一个示例,因为您说过:

有些中间有00的人应该表现相同,而其他人则不一样。


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

也许我误解了您的问题,但为什么不将位转换为数字,例如一个字节,然后切换该数字?@Wai Ha Lee,我如何将4个布尔/位转换为一个字节?嗯。我写这篇文章只是随便说说,假设你会得到很多答案。我很快就会写一个答案。在我工作的时候,我还不习惯C 6.0使用5.0,所以从我所读的内容来看,这似乎是正确的语法。VS2015正在抱怨二进制文字的用法。还在调查中。嗯,我自己也尝试过使用二进制文本,肯定还有其他的C 6.0特性,比如nameof,但是二进制文本不起作用。为这一混乱道歉。我修改了答案,不使用二进制文字。
switch ( converted )
{
    case 0: // 0000
        // elided
        break;
    case 1: // 0001
    case 9: // 1001
        // elided
        break;

    // other cases elided

    case 15: // 1111
        // elided
        break;
}