基于布尔模式的 C# 分支

本文关键字:分支 模式 于布尔 | 更新日期: 2023-09-27 18:33:19

需要根据数组中 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"语句,不是很好。每个模式都是位数组的重要部分,提取并转换为布尔数组。

基于布尔模式的 C# 分支

(

一种方式(将四个布尔值转换为一个字节:

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(。不过,其他 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 功能,只需将二进制文本替换为注释中的等效数字即可。