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