訊息類型固定為 6 種,使用者可任意組合勾選。傳統 SQL 拼接或雙重迴圈判斷代碼複雜且效能差。位運算提供 O(1) 判斷方案。
將每個選項映射為 2 的冪次(二進制單一位為 1):
public enum CategoryType : int {
Unknown = 1, // 0000 0001
Critical = 2, // 0000 0010
Error = 4, // 0000 0100
Warning = 8, // 0001 0000
Information = 16, // 0010 0000
Verbose = 32, // 0100 0000
Other = 1024 // 1000 0000 0000
}
var category = 0;
if (ckType2Checked()) category |= 2; // Critical
if (ckType4Checked()) category |= 4; // Error
if (ckType8Checked()) category |= 8; // Warning
// ... 等同於 category = 2 + 4 + 8 = 13 (0000 1101)
傳給伺服器的只是單一整數 13,對應的組合唯一(數學可證)。
foreach (var item in list) {
if (((int)item.Category & categoryFilter) > 0
&& ((int)item.Direction & directionFilter) > 0) {
yield return item;
}
}
item.Category & filter > 0 表示該類型被選中filter = 0x7FFFFFFF (全 1)ckType2Checked((category & 2) > 0);
ckType4Checked((category & 4) > 0);
// ...
| 場景 | 是否適合 | 說明 |
|---|---|---|
| 固定、較少選項 (≤32/64) | ✅ 極佳 | 單一 int/long 即可,效能最高 |
| 選項不固定/動態 | ❌ 不適合 | 需維護映射表,反而複雜 |
| 選項極多 (成千上萬) | ⚠️ 可行但罕見 | 可用整數陣列/位圖,但 UI 不會這樣設計 |
新增/修改選項需同步更新伺服端 enum 與客戶端控件,但修改範圍小、風險可控。