2016-08-18 14 views
0

私は前にそれを試してみましたが、新しいプロジェクトで、今までは問題なかったCSVファイルから行を取得するためにここにしようとしています:珍しいコード処理vb.net

私はその構造のリスト内の各行を追加してい(array of folders()と他の3つの変数の配列)

問題は、初めてlist.add()がうまく動作していますが、arraycurrentrow()コードがlist.add()の部分に達していなくても、リストの前の項目を更新しています!

注:これはアレイ部でのみ起こるが、構造体3つの他の変数問題なく

注:私は、別のプロジェクトのために同じコードを使用するが、構造は、任意の配列をhadnt?だからなぜフォルダの配列の問題()

私は一日中無駄に過ごしています!その先頭にwhileループ内

Dim StrcCurrentRow As DataBaseStrc = Nothing 

:あなたはこの問題

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

コードをステップ実行したときにデバッガからあなたに通知される内容は何ですか? –

+0

デバッガからの例外はありません –

+0

例外があるかどうか尋ねませんでした。コードをステップ実行したときに、デバッガからコード実行が伝えられたことを尋ねました。 –

答えて

1

この問題は、Stringアレイを1つだけ作成するという事実に見えます。したがって、毎回同じ要素を上書きし続けるだけです。ループ内では、新しい配列を作成し、それを移入する必要があります。

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

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

あなたはあまりにもループの外ReDimを取り除くことができます。

これまで述べてきたように、私はそのタイプを構造体からクラスに変更し、そのクラスを毎回独自の配列を作成したり、代わりにコレクションを使用するようにしました。

+0

リファレンスタイプなどを説明することなく、どうやって答えるか考えようとしていました – Plutonix

+0

@jmcilhinney多くのありがたいことに感謝していますが、なぜそれが起こったのか説明できますか?変数の定義が他の変数に影響を与えることなく、他の変数に影響を与える方法 –

+0

変数の定義とは関係がありません。オブジェクトの作成と関係しています。私がすでに述べたように、問題はあなたがたった一つの配列を作成し、それを再利用し続けたということでした。あなたのリスト内のすべてのアイテムは同じ配列を参照していて、その配列には、それらの要素に割り当てた最後の値である1セットの要素しか含めることができません。各アイテムがリストにアイテムを追加したときに持っていた要素を含む配列を参照するようにするには、各アイテムが別の配列を参照する必要があります。つまり、既存のアイテムを再利用するのではなく、アレイ。 – jmcilhinney

0

移動し、このラインのための任意のアイデアを持っている場合。 これは毎回設定していないため、オブジェクトが1つしかなく、ループごとに更新し続けます。

+2

これは問題ではありません。コードはややこしいですが、型は構造体なので、同じ型を再利用することに問題はありません。問題は、常に同じ 'String'配列が使用されているという事実です。 – jmcilhinney

+0

はいいいえ –

関連する問題