如何在VB.NET中将字符串添加到数组中?

5
我有一个如下的数组
Dim array() As String = {}

以下是相关代码:

For i = 0 To membertable.Rows.Count - 1
    If InStr(membertable.Rows(i)("name"), txtSearch.Text, CompareMethod.Text) - 1 _
       <> -1 And txtSearch.Text.Length >= 3 Then

        found = True

        'add the item that matches the criteria to the array here.

    End If
Next i

因此,该代码循环遍历一个Access表的行,并每当找到“名称”列下与我想要添加到数组中的条件匹配的值时,就将该项添加到数组中。数据库项始终为字符串。


请提供输入字符串和所需输出。 - user3962541
输入字符串是一个名称,例如在文本框中输入“Ben”将导致代码查找数据库中包含字符串“Ben”的所有名称。我希望所有这些字符串都被放入一个数组中。 - OmnivorousOctopus
你为什么要遍历行,而不使用文本作为搜索条件来获取包含该文本的行呢? - cometbill
4个回答

14

数组具有固定长度。使用 List(Of String) 代替:

Dim list As New List(Of String)()

...

list.Add(someString)

注意:列表在内部使用数组并自动调整其大小(基本上与Redim Preserve相同)。它们不是每次添加一个元素就增加列表大小,而是从4个元素的数组大小开始,并在数组变得太小时每次将其大小加倍。这减少了所需的复制操作数量,因为增加数组的大小意味着创建一个新数组并将旧数组的内容复制到新数组中。

因此,实际上没有必要自己使用Redim,因为列表会自动高效地进行操作。


顺便说一句,InStr(...) - 1 <> -1是一个奇怪的条件。它的目的是什么?InStr(...) <> 0是等价的。条件应该是InStr(...) <> -1吗?或者membertable.Rows(i)("name").Contains(txtSearch.Text)


myArray.SetValue('ben', i) 是什么意思? - AhammadaliPK
为什么不直接使用myArray(i) = "ben"呢?但这会更新一个已有的数组位置,而不是添加新的元素,也就是说,数组的大小保持不变。如果你有一个长度为10的数组,你不能添加第11个元素。只有列表才能实现这一点。 - Olivier Jacot-Descombes

3
为了回答你的问题,每次想要添加另一个项目时,你需要重新调整数组的尺寸:
Redim Preserve array(array.length)

然后将您的项目添加到最后一个:
array(array.length - 1) = ???

重要的是使用PRESERVE关键字。如果没有使用,您的数组将被清除。

更好的方法是不使用数组,而是使用集合或列表。


1
使用 List(Of String) 代替数组。此外,您可以对结果进行 LINQ 处理。最好不要将变量命名为与数据类型相同的名称。
Dim myList = (From dr As DataRow In membertable.Rows Where dr("name").ToString = txtSearch.Text).ToList

0

这取决于您添加元素到数组的频率。当它发生多次时,您不应使用任何形式的数组,包括 List。也许 LinkedList 是您正在寻找的。它们提供高效的添加(特别是在任何地方,进一步删除也很有效)。它们唯一的缺点是“慢”的 O(n) 索引。顺序 For Each 查找始终是 O(n),它们与数组之间几乎没有任何区别。

如果您只创建元素然后处理它们,您可以使用 Iterator Function(也可以作为 lambda 函数在您的过程内部实现)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接