2009-05-08 5 views
2

特定の位置に特定の値を含むコンマ区切りの文字列をとり、その値をオブジェクトのプロパティに割り当てる次のコードを構造化するより洗練された方法はありますか?区切られた文字列をオブジェクトに解析するこのコードブロックを記述するためのよりクリーンな方法はありますか?

 // split comma delimited items into a string array 
     Dim items As String() = myList.Split(CChar(",")) 

     // Assign my Person object's properties 

     // Name 
     If items.Length > 0 Then 
      Person.FullName = items(ItemIndex.FullName) 
     End If 

     // Address1 
     If items.Length > 1 Then 
      Person.Address1 = items(ItemIndex.Address1) 
     End If 

     // Address2 
     If payload.Length > 2 Then 
      Person.Address2 = items(ItemIndex.Address2) 
     End If 

EDIT:私はあまりにも、C#の例に開いています。

答えて

5

列挙子を使用することもできますが、ほとんど同じコードがかなり短くなります。

Dim items = myList.Split(",").GetEnumerator 
If items.MoveNext Then FirstName = items.Current 
If items.MoveNext Then Address1 = items.Current 
If items.MoveNext Then Address2 = items.Current 

コンマで区切られた文字列からの妥当性を検証するのはかなり難しいです。

もちろん、オブジェクトを使用している場合は、オブジェクトに何かを渡して、オブジェクトに解析させることができます。私はあなたが次の例でLinqを使用できると仮定しています。

Public Class Person 
    Private Enum Position 
     FirstName = 0 
     Address1 = 1 
     Address2 = 2 
     LastName = 3 
    End Enum 
    Sub FillFromArray(ByVal Values() As String) 
     FirstName = If(Values.ElementAtOrDefault(Position.FirstName), String.Empty) 
     Address1 = If(Values.ElementAtOrDefault(Position.Address1), String.Empty) 
     Address2 = If(Values.ElementAtOrDefault(Position.Address2), String.Empty) 
     LastName = If(Values.ElementAtOrDefault(Position.LastName), String.Empty) 
    End Sub 
    Public FirstName As String 
    Public Address1 As String 
    Public Address2 As String 
    Public LastName As String 
End Class 


Module MainModule 
    Sub Main() 
     Dim testString As String = "FirstName,Address 1,Address 2" 
     Dim testPerson As New Person 

     testPerson.FillFromArray(testString.Split(",")) 

     Debug.Assert(testPerson.FirstName = "FirstName") 
     Debug.Assert(testPerson.Address1 = "Address 1") 
     Debug.Assert(testPerson.Address2 = "Address 2") 
     Debug.Assert(testPerson.LastName = String.Empty) 

    End Sub 
End Module 
-2

私の最初の本能は、入力がカンマで区切られた文字列の形式である理由を質問することです。あなたが入力を制御せず、それだけで生きなければならないと仮定して、私はこの実装に大きな問題はありません。私はVB.netに精通していませんが、私はStringTokenizerがあると思います。私はそれを見て、代わりにそれを使用することを検討します。

0

よく見えます。あなたは可変長配列を期待していますか?

If items.Length >= 3 Then 
    // Assign properties 
Else 
    Throw New NotSupportedException("The line needs to have three items"); 
End If 
2

あなたははmyListにコンマの束を追加することができ、その後、あなたはif文をスキップすることができます:あなたは

// split comma delimited items into a string array 
myList = myList & ",,," // One comma for every property. 
Dim items As String() = myList.Split(CChar(",")) 

// Assign my Person object's properties 
Person.FullName = items(ItemIndex.FullName) 
Person.Address1 = items(ItemIndex.Address1) 
Person.Address2 = items(ItemIndex.Address2) 
+0

+1これは少しハックですが、私はそれを行うための最もクリーンな方法だと思います。配列に十分な要素があることを確認することによって、すべての条件を避けてください。 –

+0

これはまあまあですが、余分なデータを追加してコーナーケースを削除するのはかなり一般的な手法です。もう1つの例は、行列があり、その隣接セルに基づいて各セルに変換を適用する必要がある場合です。サイドとコーナーを処理するためのコードを書くのではなく、関数のアイデンティティ値で行列を囲むだけで、内部のセルを繰り返し処理するだけです。 – Eclipse

0

あなたはプロパティ名(規則)と一致ItemIndex名に依存したい場合それを完全に宣言的にするためにリフレクションを使うことができます。あなたがそれがあなたが興味を持っているルートだと思うなら、私は精緻にすることができます...

関連する問題