2016-08-18 3 views
0

ich hier versuchen, die Zeilen aus der CSV-Datei zu erhalten habe ich versucht, es vor und war kein Problem, bis jetzt in dem neuen Projekt:ungewöhnliche Codeverarbeitung vb.net

ich jede Zeile in der Liste der Struktur am Hinzufügen der hat (array of folders() und 3 andere Variablen)

Das Problem ist, wenn ich list.add() verwendet wird funktioniert beim ersten Mal aber für die zweite Zeile beim Zugriff auf die Ordnerdaten aus dem Arraycurrentrow() es aktualisiert das vorherige Element in der Liste, selbst der Code hat die Liste nicht erreicht.add() Teil !!!!

Hinweis: Dies ist nur in Array-Teil passieren, aber für die 3 anderen Variablen in der Struktur kein Problem

Hinweis: i den gleichen Code für ein anderes Projekt verwendet, aber hadnt die Struktur keine Arrays? Also warum das Problem im Array von Ordnern()

Ich verbringe den ganzen Tag ohne Hoffnung !! Wenn Sie eine Idee haben, für dieses Problem

Public Structure DataBaseStrc 
     Public Property Folders As String() 
     Public Property TagName As String 
     Public Property SAPFL As String 
     Public Property SAPEqNO As String 
    End Structure 






Shared Function MarafiqsDataBase_CSV() 
     Dim ioReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(DataBaseInserter.DatabaseCSVPathText.Text) 
     ioReader.TextFieldType = FileIO.FieldType.Delimited 
     ioReader.SetDelimiters(",") 

     Dim tempList As New List(Of DataBaseStrc) 
     Dim ReadingIndex As Integer 
     Dim StrcCurrentRow As DataBaseStrc = Nothing 
     Integer.TryParse(DataBaseInserter.MaxFoldersNoCB.Text, MaxFolderNo) 
     ReDim StrcCurrentRow.Folders(MaxFolderNo - 1) 

     While (Not ioReader.EndOfData) 
      Dim arrCurrentRow As String() = ioReader.ReadFields() 
      If arrCurrentRow.Length = 12 Then 
       Dim FolderIndex As Integer = 0 
       For FolderIndex = 0 To MaxFolderNo - 1 
        StrcCurrentRow.Folders(FolderIndex) = arrCurrentRow(FolderIndex) 
       Next 
       StrcCurrentRow.TagName = arrCurrentRow(FolderIndex) 
       StrcCurrentRow.SAPFL = arrCurrentRow(FolderIndex + 1) 
       StrcCurrentRow.SAPEqNO = arrCurrentRow(FolderIndex + 2) 
       tempList.Add(StrcCurrentRow) 
      Else 
Error handling 
      End If 

     End While 
     PublicDatabaseList = tempList 
     Return Nothing 

    End Function 
+1

Was sagt Ihnen der Debugger, wenn Sie den Code durchgehen? –

+0

Es gibt keine Ausnahme vom Debugger –

+0

Ich habe nicht gefragt, ob es eine Ausnahme gab. Ich habe gefragt, was der Debugger Ihnen über die Codeausführung gesagt hat, wenn Sie den Code durchgehen. –

Antwort

1

Das Problem scheint die Tatsache zu sein, dass Sie immer nur ein String Array erstellen, also überschreiben Sie immer dieselben Elemente jedes Mal. Innerhalb der Schleife sollten Sie ein neues Array erschaffen und bevölkern es:

StrcCurrentRow.Folders = New String(MaxFolderNo - 1) {} 

For FolderIndex = 0 To MaxFolderNo - 1 
    StrcCurrentRow.Folders(FolderIndex) = arrCurrentRow(FolderIndex) 
Next 

Sie auch loswerden der ReDim außerhalb der Schleife erhalten.

Nachdem ich all das gesagt hatte, würde ich diesen Typ von einer Struktur in eine Klasse ändern und die Klasse einfach jedes Mal ein eigenes Array erstellen oder vielleicht sogar eine Sammlung verwenden.

+0

Ich habe versucht zu denken, wie man antwortet, ohne sich zu verzetteln erklären Referenztypen usw. – Plutonix

+0

@jmcilhinney vielen Dank, dass für mich gearbeitet hat, aber können Sie erklären, warum das passiert ist? Wie sich die Definition einer Variablen auf eine andere Variable auswirkt, ohne die andere Variable aufzurufen –

+0

Es hat nichts mit der Definition von Variablen zu tun. Es hat mit der Erstellung von Objekten zu tun. Wie ich bereits sagte, war das Problem, dass Sie immer nur ein Array erstellt und es immer wieder verwendet haben. Jedes Element in Ihrer Liste bezog sich auf dasselbe Array und dieses Array kann nur einen Satz von Elementen enthalten - die letzten Werte, die Sie diesen Elementen zugewiesen haben. Wenn Sie möchten, dass sich jedes Element auf ein Array bezieht, das die Elemente enthält, die beim Hinzufügen des Elements zur Liste vorhanden waren, muss jedes Element auf ein anderes Array verweisen, dh Sie müssen für jedes Element ein neues Array erstellen und kein vorhandenes erneut verwenden Array. – jmcilhinney

0

verschieben diese Zeile:

Dim StrcCurrentRow As DataBaseStrc = Nothing 

Innerhalb der while-Schleife an ihrem Anfang. Sie setzen es nicht jedes Mal, also gibt es nur ein Objekt und Sie aktualisieren es jede Schleife.

+2

Das ist nicht das Problem. Der Code ist ein bisschen zwielichtig, aber der Typ ist eine Struktur, so dass es kein Problem mit der Wiederverwendung der gleichen gibt. Das Problem ist die Tatsache, dass immer das gleiche 'String' Array verwendet wird. – jmcilhinney

+0

Ja, das ist richtig –