2012-07-03 167 views
3

我有以下枚举:如何获取枚举值;

天数:

Sunday 1 
Monday 2 
Tuesday 4 
Wednesday 8 
Thursday 16 
Friday 32 
Saturday 64 

WeekOfMonth

First  256 
Second 512 
Third  1024 
Fourth 2048 

我有,例如,这是512的总和的数目514(Second )+2(Monday)。

我如何获得第二个&星期一如果我只有514号?

+0

你到底想干什么?你需要在那里枚举吗?似乎有一个序列或逻辑涉及,也许你可以写一些代码。 – pavanred

回答

0

您可以对每个可能的值进行逻辑与。所有返回非零值的值都是您想要的值。

var finalValue = ... // 512 -> 1000000010 
var possibleValues = ... // array of flags [00000001, 000000010, 00000100, 00001000 ... ] 

var appliedFlags = possibleValues.Where(x => x & finalValue == x).ToList(); 
+0

感谢您接受答案。我个人更喜欢@ Martin的答案。我只是希望我想到了这一点:P –

0

幸亏我,因为我可以看到它的想法似乎是二进制序列,这样可以减去此数514,这将是512,然后做同样的过程,最近的二进制其余直到你得到0 。

+0

表示你的想法,如在代码:) –

6

假设如下定义:

[Flags] 
enum Days { 
    Sunday = 1, 
    Monday = 2, 
    Tuesday = 4, 
    Wednesday = 8, 
    Thursday = 16, 
    Friday = 32, 
    Saturday = 64 
} 

[Flags] 
enum WeekOfMonth { 
    First = 256, 
    Second = 512, 
    Third = 1024, 
    Fourth = 2048 
} 

您可以使用此代码获取所需的字符串:

var value = (Int32) WeekOfMonth.Second + (Int32) Days.Monday; // 514 
var days = (Days) (value & 0xFF); 
var weekOfMonth = (WeekOfMonth) (value & 0xFF00); 
var str = String.Format("{0} & {1}", weekOfMonth, days); 

根据需要,变量str将包含Second & Monday

如果您希望能够合并多个Days值或WeekOfMonth值,则[Flags]属性非常重要。例如((Days) 3).ToString()将返回Sunday, Monday。如果您忘记[Flags]属性,则返回的字符串是3

+0

嘎 - 我只是打字! +1 ;-) – dash

+0

那么,在我的代码中,我添加了[Flags],只是忘了发布它。 :( –

0

未经测试但应该工作: 取数字并将其除以第一个WeekOfMonth值的int值。结果将是双重的,忽略逗号后面的意思。现在你有了WeekOfMonth的价值。 之后使用mod(%)除法得到除法的其余部分以获取代表您的Days值的剩余值。

在代码:

var intValue = (int)WeekOfMonth.Second + (int)Days.Monday; //514 
var weekOfMonth = (WeekOfMonth)Convert.ToInt32(intValue/(int)WeekOfMonth.First); 
var day = (Days)(intValue % (int)WeekOfMonth.First); 

我不知道如果所有的强制类型转换工作,但它应该给你的想法;)