2009-05-08 8 views
2

Gibt es eine elegantere Möglichkeit, den folgenden Code zu strukturieren, der eine durch Kommas getrennte Zeichenfolge mit bestimmten Werten an bestimmten Positionen verwendet und die Werte den Eigenschaften eines Objekts zuordnet?Gibt es eine sauberere Möglichkeit, diesen Codeblock zu schreiben, der eine Zeichenfolge mit Trennzeichen in ein Objekt zerlegt?

 // 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: Ich bin zu C# Beispiele offen, auch.

Antwort

5

Sie könnten einen Enumerator verwenden, aber es ist so ziemlich der gleiche Code nur kürzer.

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 

Es ist ziemlich schwierig zu validieren, kommend von einer Komma-begrenzten Zeichenkette.

Natürlich, wenn Sie Objekte verwenden, könnten Sie etwas an Ihr Objekt übergeben und Ihr Objekt analysieren lassen. Ich gehe davon aus, dass Sie Linq im nächsten Beispiel verwenden können.

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

Mein erster Instinkt besteht darin, zu hinterfragen, warum die Eingabe in Form einer kommagetrennten Zeichenfolge vorliegt. Unter der Annahme, dass Sie die Eingabe nicht kontrollieren und nur damit leben müssen, habe ich kein großes Problem mit dieser Implementierung. Obwohl ich mit VB.net nicht vertraut bin, denke ich, dass es einen StringTokenizer gibt. Ich würde mir das ansehen und stattdessen darüber nachdenken.

0

Sieht gut aus. Erwarten Sie Arrays variabler Länge? Sie könnten:

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

Sie ein paar Kommas auf myList hängen könnte, und dann können Sie die if-Anweisungen überspringen:

// 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 Dies ist ein bisschen wie ein Hack, aber ich denke, es ist der sauberste Weg, es zu tun. Vermeiden Sie alle Bedingungen, indem Sie sicherstellen, dass genügend Elemente im Array vorhanden sind. –

+0

Es ist eine Art Hacky, aber das Entfernen von Corner-Cases durch Hinzufügen von zusätzlichen Daten ist eine ziemlich übliche Technik. Ein anderes Beispiel ist, wenn Sie eine Matrix haben und Sie eine Transformation auf jede Zelle basierend auf ihren Nachbarn anwenden müssen. Anstatt zusätzlichen Code zu schreiben, um die Seiten und Ecken zu behandeln, umgeben Sie einfach die Matrix mit dem Identitätswert für die Funktion und iterieren nur über die inneren Zellen. – Eclipse

0

Wenn Sie auf ItemIndex Namen verlassen wollten Sie die Eigenschaftsnamen passende (convention), dann könnte Reflexion verwenden, um es vollständig deklarativ zu machen. Ich kann es ausarbeiten, wenn Sie denken, dass das eine Route ist, an der Sie interessiert sind ...

Verwandte Themen