如果您正在尋找 「最短」 的方式:
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