2012-07-03 210 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); 

我不知道如果所有的強制類型轉換工作,但它應該給你的想法;)