删除另一个数组列表中存在的数组列表中的元素

时间:2018-11-02 07:28:59

标签: vb.net arraylist

我有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定义结束循环的参数

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会生成一个新列表,而不是更改现有列表。