如果您正在寻找 “最短” 的方式:
Orientation o = Orientation.East | Orientation.West; // o.ToString() = "East, West"
var c = o.ToString().Split().Count();
甚至更短:
var c = (o + "").Split().Count();
更新
为了支持上述255的值,你可以使用任何那些丑恶的黑客:
Orientation o = (Orientation) 1023;
var c = ((Orientation)(byte)o + "").Split().Count();
c = ((Orientation)((int)o & 255) + "").Split().Count();
或只是定义枚举为字节:
[Flags]
public enum Orientation : byte
{
North = 1,
North_East = 2,
East = 4,
South_East = 8,
South = 16,
South_West = 32,
West = 64,
North_West = 128
}
更新2 我个人不会在生产中使用的代码串的方法,需要只是有点计数时尤其如此。
无论如何,我只是为了好玩而想到另一个黑客。当设置一位时,Base 2日志将返回一个完整的数字,当为0时为无穷大,当设置多个位时为其他数据。对于实施例
Math.Log(0, 2) // -Infinity
Math.Log(0, 64) // 6.0
Math.Log(0, 65) // 6.0223678130284544
所以,(byte)go != 0
可以用来检查是否有任何标志被设置,然后Math.Log((byte)go, 2) % 1 == 0
检查是否只有一个标志被设置。
但是,dasblinkenlight的解决方案似乎是最好的。
这看起来不对。你真的可以有一个既是北方又是南方的方向? –
@JonathanAllen是的,不要想一个我可以花一点时间的方向。想想哪些方向可用。可能是“方向”在这里是错误的措词;) – Norman
@ Dennis_E不是真的,因为你可以拥有像'(Orientation)1023'这样的东西,当只有8个标志时它有10个位。 – juharr