遇到问题。效率。我对编码的效率知之甚少,但我正在学习。通过这些字符串的arraylists搜索item1,并在找到时将item2添加到新的arrayList中。逻辑很棒。工作良好。但由于arrCoList中的arrLoList * 10 000个元素中有700个元素,因此大约需要30-40秒。
现在包含一旦找到item1就会丢失,所以我无法真正改进。是否有助于在arrCoList的字符串末尾删除一些字符?
我怎么能改善这个?我想从arrayLists改变?
For Each item1 In arrLoList
For Each item2 In arrCoList
If arrCoList.contains(item1) Then
arrNewList.Add(item2)
Else
intCouldntfind += 1 'not finding 7 million
End If
答案 0 :(得分:2)
首先,我不会使用旧的ArrayList
,它总是需要将对象装箱/取消装箱到它们的实际类型(string
这里)。相反,我会使用强类型List(Of String)
。
其次,您可以使用Enumerable.Except
获取设置差异,因为它在内部使用HashSet
非常有效。
Dim sw = New System.Diagnostics.Stopwatch ' measure time
Dim rnd As New Random ' create random strings
Dim loList = New List(Of String)(700)
Dim coList = New List(Of String)(10000)
' initialize with sample data
For i = 1 To 700
loList.Add(String.Format("Item: {0} Random-Value: {1}", i, rnd.Next(1, 1000)))
Next
For i = 1 To 10000
coList.Add(String.Format("Item: {0} Random-Value: {1}", i, rnd.Next(1, 1000)))
Next
sw.Start()
' *** Here is all you need: '
Dim newList = loList.Except(coList).ToList()
sw.Stop()
结果: 3毫秒最大
答案 1 :(得分:1)
你正在做一个不必要的嵌套:
这应该快得多:
For Each item1 In arrLoList
If arrCoList.contains(item1) Then
For Each item2 In arrCoList
arrNewList.Add(item2)
Next
End If
Next