3

我有以下枚举:

天:

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

月周

First     256
Second    512
Third     1024
Fourth    2048

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

如果我只有数字 514,我如何获得 Second & Monday?

4

4 回答 4

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);

该变量strSecond & Monday根据需要包含。

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

于 2012-07-03T12:16:05.057 回答
0

好吧,我有一个想法,因为我可以看到它似乎是二进制序列,因此您可以将此数字 514 减去最接近的二进制,即 512,然后对剩余的数字执行相同的过程,直到您得到 0。

于 2012-07-03T12:15:27.700 回答
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);

我不确定所有演员是否都在工作,但它应该给你这个想法;)

于 2012-07-03T12:20:59.867 回答
0

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

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

var appliedFlags = possibleValues.Where(x => x & finalValue == x).ToList();
于 2012-07-03T12:11:20.050 回答