我有以下枚举:
天
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?
答案 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);
我不确定所有演员是否都在工作,但它应该给你一个想法;)