不确定如何说出问题,请原谅我。
我正在使用Aforge.Controls.Joystick存储游戏手柄按钮按组合作为整数。 IT使用标志枚举器按下按钮 - 例如按钮1返回小数1,按钮2小数2和按钮1和2一起3(2 + 1)。
我将这个小数存储在ini中,以便在另一个类中使用。我需要做的是在另一个类中检索这个小数,并构造一个按下按钮的整数数组(基本上,哪些位是真/ 1)。一些例子:
检索到的十进制:3 返回:1,2
检索到的十进制:16 返回:5
检索到的十进制:22 返回:5,3,2
我知道我错过了一些令人眼花缭乱的东西,但迷失在所有概念中(例如按位,标记枚举等)
非常感谢任何帮助...
EDIT1:以下评论:
必须使用ini在应用程序运行之间存储此值。
在混淆之后,操纵杆的枚举器看起来像这样:
<Flags> Public Enum Pets
Button1 = 1
Button2 = 2
Button3 = 4
Button4 = 8
Button5 = 16
End Enum
因此&#34; 22&#34;按钮5,3和2(16 + 4 + 2)
EDIT2:回复1
尝试:
Imports AForge.Controls
Imports AForge
Dim txt = "22" ' value from "ini"
' parse back into an enum
Dim ButtonsPress As Joystick.Buttons = CType([Enum].Parse(GetType(Joystick.Buttons), txt), Joystick.Buttons)
Dim picks = [Enum].GetValues(GetType(Joystick.Buttons)).
Cast(Of Joystick.Buttons).
Where(Function(q) ButtonsPress.HasFlag(q)).
ToArray()
For Each v As Joystick.Buttons In picks
Console.WriteLine(v.ToString())
Next
但是,它不会编译:
'HasFlag' is not a member of 'AForge.Controls.Joystick.Buttons'
但是,当我在对象浏览器中检查Joystick.Buttons时,摘要显示: &#34;标志操纵杆按钮的枚举。&#34;
...困惑
EDIT3 - 解决了
回答以下评论和答案的组合。根据原始问题获取具体数字:
Dim txt = "22" ' value from "ini"
Dim ButtonsPress As Joystick.Buttons = CType([Enum].Parse(GetType(Joystick.Buttons), txt), Joystick.Buttons)
Dim picks = [Enum].GetValues(GetType(Joystick.Buttons)).
Cast(Of Joystick.Buttons).
Where(Function(q) (ButtonsPress And q) = q).
ToArray()
For Each v As Joystick.Buttons In picks
Console.WriteLine(v.ToString().Remove(0, 6))
Next
产地:
2
3
5
答案 0 :(得分:1)
第一步,将存储的值恢复为Enum类型:
Dim txt = "22" ' value from "ini"
' parse back into an enum
Dim p As Pets = CType([Enum].Parse(GetType(Pets), txt), Pets)
如果将数据序列化为类型化数据而不是存储为文本,则可以跳过这两个步骤。然后,获取一个表示的枚举值数组:
Dim picks = [Enum].GetValues(GetType(Pets)).
Cast(Of Pets).
Where(Function(q) p.HasFlag(q)).
ToArray()
HasFlag
的替代方法是长格式:Where(Function(q) (p And q) = q)
。然后测试一下:
For Each v As Pets In picks
Console.WriteLine(v.ToString())
Next
如果要打印/查看整数值而不是名称,请使用Console.WriteLine(v)
结果:
将Button2
BUTTON3
Button5
有一点需要注意的是Enum可以包含组合:
<Flags> Public Enum Buttons
A = 1
B = 2
AB = 3
C = 4
D = 8
E = 16
All = 31
End Enum
当值为3时,阵列将有效地包括{A,B,AB},每次两次。值31将包含所有7个元素。