2

次のコードを見てください。

Try
  Dim Reader As New System.IO.StreamReader(PositionsFileName)
  Do While Reader.Peek() <> -1
    Dim Positions() As String = Reader.ReadLine().Split("|")
    If (Positions(0) Is Nothing) Or (Positions(1) Is Nothing) Or (Positions(2) Is Nothing) Then
      ' something
    End If
  Loop
Catch ex As Exception
  ex.Source = Nothing
End Try

私はファイルを読んでいて、フォーマットsomething | something1|something2を期待しています。存在しない配列インデックスに「Nothing」を設定しようとしています(ファイル形式が壊れています)ので、Ifステートメントはスムーズに進みますが、間違っているようです。ヒントを教えていただけますか?

4

3 に答える 3

1

分割後のpositions.lengthを確認してください。また、「|| Something2 | Something3」のようなケースをチェックしたい場合、最初の位置は「Nothing」ではなく「」になります。orelseは、前の条件が満たされた場合に後者の条件が評価されないようにする短絡です。

If Positions.length < 3 OrElse Positions(0) = "" OrElse Positions(1) = "" OrElse Positions(2) = "" Then
  ' something
End If
于 2012-10-26T13:29:57.253 に答える
1

そうして、アイテムが2つしかない場合Split("|")(たとえばsomething|something1)、Positions(2)はありませんNothing、それはただそこにありません。したがって、コードは例外を発生させますindex out of bounds of the array

Positions(2)この場合に含む必要があるNothing場合、コードは次のようになります。

Dim Positions(2) As String
Dim tmpArray() As String = Reader.ReadLine().Split("|")
For i = 0 To UBound(Positions)
  If i <= UBound(tmpArray) Then
    Positions(i) = tmpArray(i)
  Else
    Positions(i) = Nothing
  End If
Next
于 2012-10-26T01:10:52.920 に答える
1

有効な行ごとに「何か」が3つしかないことを前提としています。Positions()もしそうなら、このようにあなたの割り当てを書いてみてください:

Dim Positions() As String = Reader _
    .ReadLine() _
    .Split("|") _
    .Concat(Enumerable.Repeat("Nothing", 3)) _
    .Take(3) _
    .ToArray()

これにより、毎回3つのアイテムが確保されます。何もチェックする必要はありません。

于 2012-10-26T01:25:08.850 に答える