如何讓Enum枚舉實現異或操作


var flag = Week.Monday;
flag = flag | Week.Wednesday;
if ((flag & Week.Monday) == Week.Monday )

以上等這些操作是怎么實現的,本章為你講解。

使用場景

有多個判定條件的時候,如果按條件個數傳入參數不是明智之舉。可以使用Flags的枚舉,傳入一個參數解決。

引入Flags

我們知道2進制是可以實現異或等按位運算。默認情況下,枚舉中每個元素的基礎類型都為int,那我們的Enum怎么和2進制掛鈎。

應用 System.FlagsAttribute 屬性可以創建位標志枚舉, 從而實現ANDORNOT 和 XOR 按位運算。

[Flags]
enum Days
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40
}

Days 具有 Flags 屬性,且它的每個值都是 2 的若干次冪,指數依次遞增。

FLag 2進制 10進制 16進制
Sunday 0000001 (2) 1 0x001
Monday 0000010 (2) 2 0x002
Tuesday 0000100 (2) 4 0x004
Wednesday 0001000 (2) 8 0x008
Thursday 0010000 (2) 16 0x010
Friday 0100000 (2) 32 0x020
Saturday 1000000 (2) 64 0x040

 

 

 

 

 

 

 

 

 

 

按位運算

添加條件:| 操作

flag里面包含星期一與星期三的值

var flag = Week.Monday;
flag = flag | Week.Wednesday;

 

刪除條件:& ~ 操作

flag里面只剩下星期一的值

var flag = Week.Monday | Week.Wednesday;
flag = flag & ~Week.Wednesday;

 

Flag值判斷方法:

按位操作

var flag = Week.Monday | Week.Wednesday;
 
// "flag" 為 "Monday"
if ((flag & Week.Monday) == Week.Monday )
{
    // ...
}
 
// "flag"  為"Monday 與 Wednesday"
if ((flag & (Week.Monday | Week.Wednesday)) == (Week.Monday | Week.Wednesday))
{
    // ...
}
 
// "flag" 為 "Monday 或者 Wednesday"
if ((flag & (Week.Monday | Week.Wednesday)) != 0)
{
    // ...
}

或者HasFlag方法

var flag = Week.Monday | Week.Wednesday;
 
// "flag" 為 "Monday"
if (flag.HasFlag(Week.Monday))
{
    // ...
}
 
// "flag" 為 "Monday 與 Wednesday"
if (flag.HasFlag(Week.Monday) && flag.HasFlag(Week.Wednesday))
{
    // ...
}
 
// "flag" 為 "Monday 或者 Wednesday"
if (flag.HasFlag(Week.Monday) || flag.HasFlag(Week.Wednesday))
{
    // ...
}

總算是學會了以前一直想用而不會的東西。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM