1

私が経験している興味深い問題。

文字列の分割から作成された配列を反復処理します。繰り返しながら、配列内の項目に変更を加えます。(アイテムに文字を追加します(文字列、これに関して)

変更は for ループ内で影響を受けますが、この配列を for ループの直後に使用すると、変更が「削除」されたように見え、元の配列が変更前と同様に使用されます。

おそらくbyRef、byValの問題です...しかし、特にどこにも渡していません。

誰かがこの行動に光を当てることができるかもしれません。それ以来、for ループ内にリストを作成し、文字列を変更するたびにリストに追加しました。次に、select ステートメントでリストを使用します。これは機能しますが、配列が変更をドロップする理由について興味があります。

よろしく

Dim descriptionSplit() As String
descriptionSplit = Split(unit.itemDescription, "[")

'add the cut "[" back to the strings . "[" was cut from the strings when it was split  ON "["
For Each splitSection As String In descriptionSplit.
'add back the '[' char
splitSection = "[" & splitSection
Debug.Print(splitSection)
Next

'look for and find TAGS
For Each splitSection As String In descriptionSplit
Select Case True
'Look for #UNIT# TAG

'######## HERE, the array has reverted to the original copy....
Case splitSection.Contains("[U]")
4

5 に答える 5

4

を使用するFor Eachと、splitSection変数は配列項目への参照ではなく、配列項目のコピーになります。したがって、配列自体は決して変更されません。

Forおよびインデックス変数を使用して配列を反復し、配列に直接アクセスして変更を加えます。

Visual Basic についてはあまり最新ではありませんが、C# では次のようになるはずです。

for (int i = 0; i < descriptionSplit.Length; i++)
    descriptionSplit[i] = "[" + descriptionSplit[i];

ジェームズが投稿したコードに恥知らずにニックネームを付けて、完全を期すためにここに投稿し、メモリから VB.NET を書くことができないことを隠します :-)

For index As Integer = 0 To descriptionSplit.Length-1
    descriptionSplit(index) = "[" & descriptionSplit(index)
Next
于 2013-07-10T10:58:15.853 に答える
1

ここでは実際に配列をまったく変更していません。したがってFor Each、値の型で aを実行すると、各項目のコピーが取得されます。

splitSection = "[" & splitSection

ループのコンテキスト内でのみ適用され、これらの変更は配列に反映されません。

アイテムを処理するときにアイテムを変更することが目標の場合はfor、配列にインデックスを付けることができる基本的なループを使用する必要があります。

For index As Integer = 0 To descriptionSplit.Length-1
    descriptionSplit(index) = "[" & descriptionSplit(index)
Next
于 2013-07-10T10:58:15.420 に答える
1

配列を変更することはありません。あなたがすることは次のとおりです。

ループ変数に新しい値を割り当てます。

それで全部です。これは、配列内の値を変更しません。

于 2013-07-10T10:58:25.157 に答える
0

わかりました、これまで見てきたことから:

splitSectionループのスコープ内にのみ存在するvariable に新しい参照を割り当てるだけなので、配列内の参照は決して変更されません。

解決:

Dim descriptionSplit() As String
descriptionSplit = Split(unit.itemDescription, "[")

For i As Integer = 0 To descriptionSplit.Length - 1 
    descriptionSplit(i) = "[" & descriptionSplit(i)
Next

お役に立てれば!

于 2013-07-10T11:07:26.140 に答える
0

これは、次のコードが原因です。

For Each splitSection As String In descriptionSplit
Select Case True
 ... 

YoursplitSectionは の文字列になりdescriptionSplit、その分割配列は元の 文字列の配列になります。

元の分割の配列を変更する必要があるためです。

私は の専門家ではありませんVBが、あなたがタグで書いたことを考えるとC#:

for(var i=0; i< descriptionSplit.Length; i++) {
    descriptionSplit[i] = "[" + descriptionSplit[i];
}
于 2013-07-10T10:58:55.627 に答える