1

我遇到的奇怪问题。

我遍历从字符串拆分创建的数组。在迭代中,我对数组中的项目进行了修改。(向项目添加字符(字符串,在这方面)

更改在 for 循环中受到影响,但是在 for 循环之后直接使用此数组时,更改似乎被“删除”,并且与更改之前一样使用原始数组。

这可能是一个 byRef,byVal 问题......但我并没有专门将它传递到任何地方。

也许有人可以对这种行为有所了解。我已经在 for 循环中建立了一个列表,并在我进行字符串更改时添加到它。然后我在我的选择语句中使用该列表。这行得通,但我很好奇为什么数组会放弃它的变化。

问候

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];

为了完整起见,我将无耻地删掉 James 发布的代码并将其发布在这里,并隐藏我无法从内存中编写 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

这是因为这段代码:

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

splitSection成为 的字符串descriptionSplit,并且该拆分数组是原始 字符串的数组。

因为您需要更改原始拆分数组。

我不是专家VB,但考虑到您在标签中写道C#

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

好的,从我目前看到的情况来看:

您只是为您的 variable 分配了一个新的引用splitSection,它只存在于循环的范围内 - 所以数组中的引用永远不会改变。

解决方案:

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 回答