【问题标题】:Iterating through arraylist and removing an object遍历arraylist并删除一个对象
【发布时间】:2014-08-26 15:37:10
【问题描述】:

标题说明了一切,我在遍历我制作的数组列表(歌曲)并在找到特定歌曲后删除它时遇到了一些麻烦。我已确认位置正确,并尝试手动输入歌曲的位置,但无济于事。

    Sub delete(location As String)
    Dim tempS As Song
    For Each tempS In songs
        If tempS.getLocation().toLower().Equals(location) Then
            songs.Remove(tempS)
        End If
        Exit For
    Next
End Sub

这个项目仍处于起步阶段,唯一与歌曲相关的是它的存储位置(ei C:\Music\Albums\Once\Nemo.mp3)。非常感谢!

【问题讨论】:

  • .equals(location) 中的位置是否也降低了?如果不是,则不会匹配。
  • 我想你希望 Exit ForIf 块内。迭代任何数组并在迭代期间删除项目时要小心,因为在删除其中一个后,您无法始终确定要迭代的内容。
  • 它将是 C:\Music\Albums\Once\Nemo.mp3 与 c:\music\albums\once\nemo.mp3
  • 另外,马特是对的。移动那个出口。
  • 谢谢你们!移动出口就成功了,简直不敢相信它是如此简单!哈哈是的,我的错我忘了提到所有歌曲在添加到数组列表之前都会转换为较低的。

标签: .net vb.net arraylist iteration remove-method


【解决方案1】:

您的代码中有几个问题。

首先,您没有比较相同的情况,因为 location 后面没有 .ToLower() 。

其次,您可能会从列表中删除一个项目,同时仍在迭代它。这可能会导致问题。

您可以通过使用 linq 大大改善这一点。这样您就可以在一行中完成所有操作:

Public Sub DeleteByLocation(location As String)
    songs.RemoveAll(Function(x) x.GetLocation().Equals(location, StringComparison.OrdinalIgnoreCase))
End Sub

如果您确定只有一个匹配位置,请将 RemoveAll 更改为 Remove 以提高性能

【讨论】:

  • 谢谢马特,直截了当,用更少的代码完成了我需要的工作。
猜你喜欢
  • 1970-01-01
  • 2018-08-04
  • 2019-11-10
  • 2015-07-22
  • 2017-09-06
  • 1970-01-01
  • 2018-02-10
  • 2014-05-04
  • 2014-01-20
相关资源
最近更新 更多