2017-08-07 2 views
-1

を使用してVB.netでの構造体配列のメンバーを反復処理する方法:私はその後、翻訳するために使用される構造要素を定義し私はこのようになりますvb.net列挙持つメンバ関数

' define enumeration for keypad states 
Enum KeyPadState 
    KEYPAD_NO   ' no keypad 
    KEYPAD_UC   ' upper case keypad 
    KEYPAD_LC   ' lower case keypad 
    KEYPAD_NU   ' numeric keypad 
    KEYPAD_SY   ' symbol keypad 
End Enum 

を上記の列挙型のメンバを列挙値から文字列値に変換して戻します。宣言された構造は以下のようになります。私が挿入しようとしているメンバ関数に注意してください。 「新しい」ものが機能しています。

' define keypad type look up structure 
Private Structure KeyPadXlat 
    Dim KeyPadEnum As KeyPadState 
    Dim KeyPadStr As String 

    ' initializer subroutine 
    Public Sub New(nKeyPadEnum As KeyPadState, nKeyPadStr As String) 
     KeyPadEnum = nKeyPadEnum 
     KeyPadStr = nKeyPadStr 
    End Sub 

    ' translate string to enum 
    Public Function ToEnum(xKeyPadStr As String) As KeyPadState 

     For Each item As KeyPadXlat In ???? 

     Next 
    End Function 

    ' translate enum to string 
    Public Function ToStr(xKeyPadEnum As KeyPadState) As String 

    End Function 

End Structure 

構造体配列の実際のインスタンスを、イニシャライザコードとともに以下に示します。

Dim KeyPadLookUp() As KeyPadXlat = { _ 
            New KeyPadXlat(KeyPadState.KEYPAD_NO, "KEYPAD_NO"), _ 
            New KeyPadXlat(KeyPadState.KEYPAD_UC, "KEYPAD_UC"), _ 
            New KeyPadXlat(KeyPadState.KEYPAD_LC, "KEYPAD_LC"), _ 
            New KeyPadXlat(KeyPadState.KEYPAD_NU, "KEYPAD_NU"), _ 
            New KeyPadXlat(KeyPadState.KEYPAD_SY, "KEYPAD_SY") _ 
            } 

私の質問は、列挙値と文字列値の間を行き来するように作成しようとしているメンバー関数に関してです。私は参考のために、再びここではそれらのいずれかをコピーした:私は助けを必要と何

' translate string to enum 
    Public Function ToEnum(xKeyPadStr As String) As KeyPadState 

     For Each item As KeyPadXlat In ???? 

     Next 
    End Function 

はにいるとき、それは、構造体配列の要素のすべてにわたって反復するようにFor Eachループのコードを記述する方法でありますメンバー関数

+0

ループは必要ありません。 'Enum'クラスには、すでに必要なものがすべてあります。 – jmcilhinney

答えて

1

本当に、すべてのコードが必要なわけではありません。これはうまくいくはずです。

Enum KeyPadState 
    KEYPAD_NO   ' no keypad 
    KEYPAD_UC   ' upper case keypad 
    KEYPAD_LC   ' lower case keypad 
    KEYPAD_NU   ' numeric keypad 
    KEYPAD_SY   ' symbol keypad 
End Enum 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Dim state As KeyPadState 
    state = KeyPadState.KEYPAD_LC 

    'this line will assign the name of the enum `state` to a string called `tempstring` 
    'It's hardly worth encapsulating it into a function so I've left it as is 
    'But if you want to provide consistent code, it would be better to. 
    Dim tempstring As String 
    tempstring = [Enum].GetName(GetType(KeyPadState), state) 

    Dim anyString As String = "KEYPAD_UC" 
    Dim tempState As KeyPadState 
    'the following line will try to parse `anyString` to an enum value of the same type as the variable to be assigned. 
    'In this case `state` 
    tempState = ParseToKeypadState(anyString) 

End Sub 

Private Function ParseToKeypadState(tempString As String) As KeyPadState 
    Dim returnValue As KeyPadState 
    If Not [Enum].TryParse(tempString, returnValue) Then 
     'handle parsing error here 
    End If 
    Return returnValue 
End Function 
+0

種類があり、有用な回答をありがとう。 –

0

コードに問題があります。

まず、名前付け規則が貧弱であることをお勧めします。 .NETフレームワーク全体で行われた場合、列挙型は次のようになります。

Enum KeyPadState 
    None 
    UpperCase 
    LowerCase 
    Numeric 
    Symbol 
End Enum 

これは明確で自己記述的です。

第2に、「Xlat」のような略語を使用することは推奨されません。これは、事前知識なしに誰にも無意味です。 「翻訳」と書いて、Intellisenseがコードで使用する必要があるときはいつでもそれを見つけることが大変ですか?

あなたのクラスの実装については、なぜメソッドが必要なのですか?インスタンスを作成するときにKeyPadState値とテキスト表現を渡しているので、それらのメソッドは何を行うのですか?あなたの構造は、単にコンストラクタと二つの性質でなければなりません:

Private Structure KeyPadStateTranslation 

    Public ReadOnly Property Value As KeyPadState 
    Public ReadOnly Property Text As String 

    Public Sub New(value As KeyPadState, text As String) 
     Me.Value = value 
     Me.Text = text 
    End Sub 

End Structure 

インスタンスが作成されたときに、プロパティ値が設定されており、それらはプロパティ経由で取得されています。すべてにも適切な名前が付けられています。

Private Structure KeyPadStateTranslation 

    Public ReadOnly Property Value As KeyPadState 
    Public ReadOnly Property Text As String 

    Public Sub New(value As KeyPadState) 
     Me.Value = value 
     Me.Text = value.ToString() 
    End Sub 

End Structure 

また、その構造がPrivate宣言されているという事実が問題です:あなたは、単にそれを得るために値にToStringを呼び出すことができますので、あなたも、テキストを提供する必要はありません、と述べた

。これは、別の型の中で宣言されていることを示します。それは正しくありません。構造体は、クラスのようにファーストクラスの型であるため、クラスと同様に専用のコードファイルに属します。

しかし、その構造のポイントは何ですか?値やテキストに一致するインスタンスを見つけるために配列をループしなければならないので、実際に役立たないでしょう。 Dictionaryの方が良いかもしれませんが、変換する必要がある場合はToStringを値に呼び出し、逆の場合はまたは.TryParseを使用してください。

関連する問題