我有2个数组列表,dateListDead和dateListNotMinggu。两者都是数组的DateTime列表。这是数组列表中日期值的示意图 The arrayList value
应删除其他数组列表中存在的特定元素。
到目前为止,我尝试过,此代码无法正常工作。
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定义结束循环的参数
答案 0 :(得分:3)
主要是因为您正在使用从第一个索引到最后一个索引的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
用作第二个嵌套循环。仅在有充分理由的情况下才应使用其他东西。请记住,循环计数器并不代表列表中的值,而是代表其索引。这就是为什么您将d
用于 i ndex,而不将ArrayList
用于 d ate之类的原因。
编辑:
根据下面Jimi的评论,通常通过简单的LINQ查询来解决此问题。如果您使用的是LINQ,那么您肯定不会使用List(Of Date)
,而是使用dateListNotMinggu = dateListNotMinggu.Except(dateListDead).ToList()
。在这种情况下,代码如下所示:
ArrayLists
如果您完全疯了,想使用LINQ和dateListNotMinggu = New ArrayList(dateListNotMinggu.Cast(Of Date)().
Except(dateListDead.Cast(Of Date)()).
ToArray())
,那么它将起作用:
const copyAnimation = (item) => {
item.classList.add('copied');
};
copyTextArea.addEventListener('click', () => {
copyAnimation(clonedCode);
});
请注意,正如我在评论中回答的那样,使用LINQ会生成一个新列表,而不是更改现有列表。