我定义了以下枚举器:
[Flags]
public enum CoinSizes
{
[Display(Name = "0.01")]
OneCent = 0x1,
[Display(Name = "0.02")]
TwoCent = 0x2,
[Display(Name = "0.05")]
FiveCent = 0x4,
[Display(Name = "0.10")]
TenCent = 0x8,
[Display(Name = "0.20")]
TwentyCent = 0x16,
[Display(Name = "0.25")]
TwentyFiveCent = 0x32,
[Display(Name = "0.50")]
FiftyCent = 0x64,
[Display(Name = "1.00")]
OneDollar = 0x128,
[Display(Name = "2.00")]
TowDollar = 0x256,
[Display(Name = "5.00")]
FiveDollar = 0x512,
[Display(Name = "10.00")]
TenDollar = 0x1024,
[Display(Name = "25.00")]
TwentyFiveDollar = 0x2048,
[Display(Name = "50.00")]
FiftyDollar = 0x4096
}
我正在构建一个MVC Web应用程序,并且我定义了一个自定义的EnumCheckboxListFor助手。在帮助程序中,我使用Linq迭代Enum项目并检查选择了哪些项目,因此需要检查哪些复选框。
我使用以下内容获取可用枚举的完整列表,然后重复这些列表:
Enum.GetValues((typeof(TEnum)))
LINQ:
TEnum enumValues = expression.Compile()((TModel)htmlHelper.ViewContext.ViewData.Model);
IEnumerable<SelectListItem> items = Enum
.GetValues(enumType)
.Cast<Enum>()
.Select(c => new SelectListItem
{
Text = c.EnumDisplayName().ToString(),
Value = c.ToString(),
Selected = enumValues != null && (value.Equals(c) || value.ToString().Contains(c.ToString()))
}).ToList();
我知道确定&#34;选择&#34;的逻辑。并不完美,但这是一个WIP。主要是,Enum.GetValues()返回的数组是奇数:
Enum.GetValues((typeof(TEnum)))
{Href.DataStore.Gambling.Core.CoinSizes[13]}
[0]: OneCent
[1]: TwoCent
[2]: FiveCent
[3]: TenCent
[4]: 22
[5]: 50
[6]: 100
[7]: 296
[8]: 598
[9]: 1298
[10]: 4132
[11]: 8264
[12]: 16534
前四个是正确的,但显然那些int值(从索引4开始)并不对应于枚举&#39;值。
为什么我会得到那些奇怪的价值?
答案 0 :(得分:2)
0X16是hexadecimal值,等于1 * 16 + 6 = 22.
类似地,
0x32 = 3 * 16 + 2 = 50
0x64 = 6 * 16 + 4 = 100,依此类推。
尝试将十六进制值更改为十进制值,即
[Flags]
public enum CoinSizes
{
[Display(Name = "0.01")]
OneCent = 1,
[Display(Name = "0.02")]
TwoCent = 2,
[Display(Name = "0.05")]
FiveCent = 4,
[Display(Name = "0.10")]
TenCent = 8,
[Display(Name = "0.20")]
TwentyCent = 16,
[Display(Name = "0.25")]
TwentyFiveCent = 32,
[Display(Name = "0.50")]
FiftyCent = 64,
[Display(Name = "1.00")]
OneDollar = 128,
[Display(Name = "2.00")]
TowDollar = 256,
[Display(Name = "5.00")]
FiveDollar = 512,
[Display(Name = "10.00")]
TenDollar = 1024,
[Display(Name = "25.00")]
TwentyFiveDollar = 2048,
[Display(Name = "50.00")]
FiftyDollar = 4096
}
将Flags枚举用于碰撞值是不明智的。如果使用,Oring或ANDing会产生不希望的结果。
答案 1 :(得分:1)
使用十六进制代码返回的值是正确的。所以0x16是22.因为1 * 16 + 6是22.另外对于像0x64这样的其他值是100。