以下のコードでClassic Asp VBScriptの配列を反復処理する最良の方法は何ですか?
For i = LBound(arr) To UBound(arr)
LBound
を使用して求めている点は何ですか?確かにそれは常に0です。
以下のコードでClassic Asp VBScriptの配列を反復処理する最良の方法は何ですか?
For i = LBound(arr) To UBound(arr)
LBound
を使用して求めている点は何ですか?確かにそれは常に0です。
理由:VB6でも
Option Base 1
を、あなたはこのような特定の配列の下限を変更することができますFor Each
を使用しないでください。そうすれば、LBound
とUBound
が何であるか気にする必要はありません。私はいつも、それぞれのために使用してきました
Dim x, y, z
x = Array(1, 2, 3)
For Each y In x
z = DoSomethingWith(y)
Next
おそらくVB6から来ています。 VB6でOption Base文で、あなたは下のこのような配列の下限を変更することができますので:
Dim myArray(4 To 42) As String
...
に良い理由がFor i = LBound(arr) To UBound(arr)
dim arr(10)
10 0〜(と仮定して、配列の11のメンバーを割り当てを使用しないでありますVB6デフォルトオプションベース)。
多くのVB6プログラマは、配列が1から始まり、割り当てられたarr(0)
を使用しないと想定しています。 For i = 1 To UBound(arr)
またはFor i = 0 To UBound(arr)
を使用すると、arr(0)
が使用されているかどうかがわかるため、バグの潜在的な原因を取り除くことができます。
For each
は、ポインタではなく各配列要素のコピーを作成します。
これには2つの問題があります。
値を配列要素に代入しようとすると、元の配列に値が反映されません。このコードは、変数i
に値47を割り当てますが、要素arr
には影響しません。
arr = Array(3,4,8) for each i in arr i = 47 next i Response.Write arr(0) '- returns 3, not 47
我々はfor each
に配列要素のインデックスを知らない、と私たちは要素の順序を保証するものではありません(順序であるように見えますが。)
LBound
は必ずしも0になるとは限りません。
VBScriptでは0の下限以外の配列を作成することはできませんが、COMコンポーネントからバリアントの配列を取得することは可能です異なるLBound
を指定した可能性があります。
それは、私はそれのようなことをやったことはないと言った。
あなたの例の 'y'は配列のセルのコピーであり、参照ではないので、' For Each'を使って直接配列のセルを編集することはできません。配列の編集のために、 'for i = LBound(arr)To UBound(arr)'は 'arr(i)'を使って直接セルを参照し、 'arr(i)= Trim(arr(i) )) ')。 –