2012-02-23 107 views
4

我有枚舉:枚舉具有標誌屬性

[Flags, Serializable,] 
    public enum WeekDays { 
     Sunday = 1, 
     Monday = 2, 
     Tuesday = 4, 
     Wednesday = 8, 
     Thursday = 16, 
     Friday = 32, 
     Saturday = 64, 
     WeekendDays = Sunday | Saturday, 
     WorkDays = Monday | Tuesday | Wednesday | Thursday | Friday, 
     EveryDay = WeekendDays | WorkDays 
    } 

而且,我有屬性WeekDays在包含WeekDays枚舉值類:從週一

public int WeekDays {get; set;} 

例如WorkDays含有62(到星期五)。
如何檢查當前WeekDays屬性是否包含當前日期?

+5

如果你想讓你的財產成爲枚舉類型,它應該是'public weekDays WeekDays' ...只是說''。 – BoltClock 2012-02-23 10:50:32

+0

測試'x'是否包含一些標誌子集:'(x&subset)== subset' – harold 2012-02-23 10:52:31

+0

感謝所有人的回答。 – user348173 2012-02-23 11:07:47

回答

9

枚舉具有方法HasFlag,以確定是否一個或多個位字段在銅集rrent實例。

+0

顯然存在性能問題 - 在您的鏈接的MSDN社區反饋部分中陳述。鏈接到更快的實現:http:// stackoverflow。com/q/7984377/328397然而,一如既往,性能下降不是一個問題,直到你成爲一個問題。 – 2012-02-23 10:58:30

0

獲取所有枚舉名稱和值,然後執行「和」計算,以測試是否平日包含當天

6

使用位運算符&,看是否有值是一組的一部分:

var today = WeekDays.Thursday; 
var workdays = WeekDays.WorkDays; 

if((today & workdays) == today) { 
    // today is a workday 
} 

if((today & WeekDays.Friday) == today) { 
    // it's friday 
} 
+0

+1 Further reading:http://journal.stuffwithstuff.com/2008/03/05/checking-flags-in-c-enums/ – 2012-02-23 10:54:33

+0

注意:此代碼僅適用於星期四。 ;-) – Chris 2012-02-23 11:01:25

+1

@Chris可悲的是,一旦你開始談論日期邏輯,你確實得到的代碼只能在星期四的野外工作......事實上,我曾經記得看到需要每隔一段時間運行一次的維護代碼4月29日,主只知道它在做什麼,他們在想什麼。 – 2012-02-23 11:03:47

3

使用&

[Flags, Serializable,] 
    public enum WeekDays 
    { 
     Sunday = 1, 
     Monday = 2, 
     Tuesday = 4, 
     Wednesday = 8, 
     Thursday = 16, 
     Friday = 32, 
     Saturday = 64, 
     WeekendDays = Sunday | Saturday, 
     WorkDays = Monday | Tuesday | Wednesday | Thursday | Friday, 
     EveryDay = WeekendDays | WorkDays 
    } 

    public static WeekDays Days { get; set; } 

    private static void Main(string[] args) 
    { 
     WeekDays today = WeekDays.Sunday; 

     Days = WeekDays.WorkDays; 

     if ((Days & today) == today) 
     { 
      Console.WriteLine("Today is included in Days"); 
     } 

     Console.ReadKey(); 
    } 
1

做:

int r = (int)(WeekDays.WorkDays & WeekDays.Sunday) 
if (r !=0) 
    you have it. 
3
WeekDays weekDayValue = .... ; 
var today = Enum.Parse(typeof(WeekDays),DateTime.Now.DayOfWeek.ToString()) 
bool matches = (weekDayValue & today) == today; 
+0

由於dayOfWeek從0-6開始並不匹配此枚舉中的值,因此這不起作用。 – Chris 2012-02-23 11:04:43

+0

DayOfWeek是一個枚舉值,它的值與WeekDays中的值相匹配http://msdn.microsoft.com/en-us/library/system.dayofweek.aspx – wiero 2012-02-23 11:06:53

+0

我同意它的一個枚舉,但值與其中的值不同上面定義的枚舉。例如,上面的枚舉定義星期四爲16。 DayOfWeek週四的價值是什麼?除非我錯過了它的4 ... – Chris 2012-02-23 11:27:18

1

你只需要使用按位布爾邏輯來做到這一點。如果你說

WeekDays.Tuesday & WeekDays.WorkDays 

那麼布爾邏輯將返回4(因爲4 & 62 = 4)。

基本上&是說如果兩個都是1,那麼每個位的位置就返回那個數字。所以,你只需要將檢查它是否> 0

要在目前的形式獲得今天那麼你就需要做一些數學...

(int)DateTime.Now.DayOfWeek將返回一週中的一天範圍從 0(星期日)至6(星期六)。

我們需要映射這些以匹配您的範圍。幸運的是,這對Math.Pow很容易。

int today = Math.Pow(2,(int)DateTime.Now.DayOfWeek); 
if (today&WeekDays.WorkDays>0) 
    isWorkDay = true; 
else 
    isWorkDay = false;