2016-03-16 64 views
1

不知道如何標註該問題,請原諒我。從存儲的標誌枚舉值中獲取整數數組

我正在使用Aforge.Controls.Joystick存儲遊戲板按鈕組合爲一個整數。 IT使用Flag Enumerator作爲按鈕(例如按下) - 例如,按鈕1返回小數點1,按鈕2小數點2和按鈕1和2一起3(2 + 1)。

我將這個小數存儲在一個ini中用於另一個類。我需要做的是在另一個類中檢索這個小數,並構造一個按鈕被按下的整數數組(基本上,哪些位是true/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 

因此, 「22」 將按鈕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,總結如下: 「操縱桿按鈕的標誌枚舉。」

不解......

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

十進制:16返回:5 十進制:22返回值:5,3,2這是沒有意義的。說明。那你爲什麼用ini?如果您想稍後存儲信息或每次軟件初始化,那麼這就很好。看起來不像你的情況。爲什麼不將這些整數存儲在數組中並將數組傳遞給其他類中的方法? – Claudius

+0

而不是寫入文件來傳遞數據,只是傳遞類型化的數據。那麼你可以測試它,因爲它的意思是使用 – Plutonix

+0

不確定它沒有意義,Claudius - 請參閱上面的edit1。總的來說,我需要將十進制值存儲在ini中以供以後檢索。如果可以實現解決方案,我可以在第二個類中包含AForge庫以訪問枚舉器。 – stigzler

回答

1

第一步,得到所存儲的值返回到一個枚舉類型:

Dim txt = "22"   ' value from "ini" 
' parse back into an enum 
Dim p As Pets = CType([Enum].Parse(GetType(Pets), txt), Pets) 

這些2個步驟如果數據被序列化爲鍵入的數據而不是作爲文本存儲,則可以跳過。然後,獲得表示的枚舉值的數組:

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


一個警告用這是當枚舉可以包括連擊:

<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個元素。

+0

謝謝你 - 看起來好像越來越近了。但是,有編譯錯誤,請參閱OP中的EDIT2。 – stigzler