如何获得枚举值;

时间:2012-07-03 12:06:41

标签: c# enums

我有以下枚举:

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

WeekOfMonth

First     256
Second    512
Third     1024
Fourth    2048

例如,我有一个数字514,它是512(Second)+2(Monday)之和。

我怎样才能得到Second&周一,如果我的号码只有514?

4 个答案:

答案 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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

我有一个想法,因为我可以看到它似乎是二进制序列,所以你可以将这个数字514减去最接近的二进制数,这将是512,然后对剩余的进行相同的处理直到你得到0。

答案 3 :(得分: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);

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