2012-02-23 66 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;