我有一个像这样的数组
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
因此代码遍历访问表的行,并且每次在&#34; name&#34;下找到一个值。与我想要将该项添加到数组的条件匹配的列。数据库项始终是一个字符串。
答案 0 :(得分:5)
数组具有固定长度。改为使用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)
?
答案 1 :(得分:2)
要回答您的问题,每次要添加其他项目时都需要重新标注数组:
Redim Preserve array(array.length)
然后将您的项目添加到最后一项:
array(array.length - 1) = ???
重要的是使用PRESERVE关键字。没有它,您的阵列将被清除。
更好的方法是根本不使用数组,而是使用集合或列表。
答案 2 :(得分:1)
使用List(Of String)
代替数组。您也可以LINQ
结果。最好不要将变量命名为与数据类型相同的名称。
Dim myList = (From dr As DataRow In membertable.Rows Where dr("name").ToString = txtSearch.Text).ToList
答案 3 :(得分:0)
这取决于您向阵列添加元素的频率。当它多次发生时,你不应该使用任何形式的数组,包括List
s。也许LinkedList
是您正在搜索的内容。它们提供有效的添加(特别是在任何地方,进一步删除也很有效)。他们唯一的缺点是&#34;慢&#34; O(n)索引。顺序For Each
查找始终为O(n),它们与数组之间几乎没有任何区别。
如果您只是创建元素然后处理它们,您可以使用Iterator Function
s(也可以作为程序中的lambda)。