我有2个数组列表,dateListDead和dateListNotMinggu。两者都是数组的DateTime列表。这是日期值的阵列中的列表中的ilustration ArrayList中值
它应该删除存在于其他数组列表中的特定元素。
到目前为止,我尝试过,此代码不起作用。
Dim d, x As Integer
For x = 0 To dateListDead.Count - 1
For d = 0 To dateListNotMinggu.Count - 1
If dateListNotMinggu(d) = dateListDead(x) Then
dateListNotMinggu.RemoveAt(d)
End If
Next
Next
错误是:索引超出范围。怎么会这样 ?我基于arraylist.count -1定义了结束循环的参数
主要是您正在使用For
从第一个索引到最后一个索引的循环,但是在删除值时没有考虑索引的变化。如果可能有多个值,则应该从头开始,从头开始,而不是从头开始。在这种情况下,删除项目不会影响您要测试的项目的索引。如果只有一场比赛,那么当您找到一场比赛时,您应该退出循环。
无论哪种方式,虽然您不必这样做,但我建议For Each
在外部使用循环。如果要对列表中的每个项目执行操作,那么这正是For Each
循环的目的。仅For
在需要将循环计数器用于除依次访问每个项目以外的其他用途时,才使用循环。
对于多个比赛:
For Each dateDead As Date In dateListDead
For i = dateListNotMinggu.Count - 1 To 0 Step -1
If CDate(dateListNotMinggu(i)) = dateDead Then
dateListNotMinggu.RemoveAt(i)
End If
Next
Next
对于单场比赛:
For Each dateDead As Date In dateListDead
For i = 0 To dateListNotMinggu.Count - 1
If CDate(dateListNotMinggu(i)) = dateDead Then
dateListNotMinggu.RemoveAt(i)
Exit For
End If
Next
Next
请注意,我也将Date
值转换为该类型以进行比较,这是必需的Option Strict On
。Option Strict
是Off
默认设置,但是您应该始终将其打开,On
因为它将通过专注于数据类型来帮助您编写更好的代码。
另外,上面的代码可与List(Of Date)
以及一起使用,ArrayList
但对不需要强制转换List(Of Date)
。这是使用泛型List(Of T)
而非的优势之一ArrayList
,而泛型对包含的内容没有任何限制。
如果您确实必须使用For
循环,因为那是您的作业所要说的,那么它将看起来像这样:
For i = 0 To dateListDead.Count - 1
For j = dateListNotMinggu.Count - 1 To 0 Step -1
If CDate(dateListNotMinggu(j)) = CDate(dateListDead(i)) Then
dateListNotMinggu.RemoveAt(j)
End If
Next
Next
和这个:
For i = 0 To dateListDead.Count - 1
For j = 0 To dateListNotMinggu.Count - 1
If CDate(dateListNotMinggu(j)) = CDate(dateListDead(i)) Then
dateListNotMinggu.RemoveAt(j)
Exit For
End If
Next
Next
请注意,习惯上将其i
用作循环计数器的第一个选项,然后j
用作第一个嵌套循环,然后k
用作第二个嵌套循环。仅在有充分理由的情况下才应使用其他东西。请记住,循环计数器并不代表列表中的值,而是代表其索引。这就是为什么你使用的i
为我ndex,而不是d
为d吃等。
编辑:
根据下面Jimi的评论,通常通过简单的LINQ查询来解决此问题。如果您使用的是LINQ,那么您肯定不会使用ArrayList
而是List(Of Date)
。在这种情况下,代码如下所示:
dateListNotMinggu = dateListNotMinggu.Except(dateListDead).ToList()
如果您完全疯了,想使用LINQ,ArrayLists
那么这将起作用:
dateListNotMinggu = New ArrayList(dateListNotMinggu.Cast(Of Date)().
Except(dateListDead.Cast(Of Date)()).
ToArray())
请注意,正如我在评论中回答的那样,使用LINQ会生成一个新列表,而不是更改现有列表。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句