我有一个动态字符串数组,并且我使用 ReDim 等填充了一些动态值。我想从字符串数组中的特定位置删除一个项目。我已经阅读过有关使用 System.Linq 使用Where 条件的信息,但无法真正得到正确的答案。有什么建议吗?
Dim dynamic() as String
...
Redim dynamic(2)
..
dynamic(0) = Apple
dynamic(1) = Banana
dynamic(2) = Orange
..
dynamic(i).Remove... etc?
最佳答案
正如其他人提到的,从技术上讲,没有办法从数组中删除元素。修改数组中元素数量的唯一方法是创建一个全新的数组并将内容从一个数组复制到另一个数组。您可以使用更方便的方法来完成此操作,但最终,这就是他们实际上在幕后为您做的事情。
如果您要做很多此类事情,我建议使用 List(Of String)
类而不是 String
数组。正如其他人所指出的,List(Of T)
类专门设计用于使此类动态函数更加简单。如果您需要将列表作为数组,您可以非常轻松(且有效)地将其转换为数组,如下所示:
Dim myList As New List(Of String)()
myList.Add("Apple")
myList.Add("Banana")
myList.Add("Orange")
myList.RemoveAt(1)
Dim myArray() As String = myList.ToArray()
但是,如果您确实必须将其作为数组,LINQ 确实会使它变得更容易一些。通过导入 LINQ 命名空间,许多新的 LINQ 扩展方法将被添加到数组(以及任何其他列表或可枚举对象)中。例如,您可以使用 LINQ 的 Except
方法,如下所示:
Dim dynamic() As String = {"Apple", "Banana", "Orange"}
dynamic = dynamic.Except({"Banana"}).ToArray()
请注意,Except
方法返回一个可枚举对象,而不是一个数组。要将其转换为数组,您需要另外调用 LINQ 的 ToArray
方法,如上面的示例所示。上面的示例从数组中间删除了字符串“Banana”。但是,如果您不知道该值并且只想通过索引删除它,则 LINQ 不提供这样的按索引过滤的方法。不过,您仍然可以像这样使用 Except
方法:
Dim dynamic() As String = {"Apple", "Banana", "Orange"}
dynamic = dynamic.Except({dynamic(1)}).ToArray()
您可能想知道为什么我将大括号放在传递给 Except
方法的参数两边。我这样做是因为 Except
方法实际上采用一个参数列表(具体来说,IEnumerable
)。由于数组实现了 IEnumerable
(顺便说一句,还有 IList
),因此我只是将参数包装在数组中,然后再将其传递给方法。有趣的结果是,如果您有多个项目要删除,您可以用一个命令来完成所有这些操作,如下所示:
Dim dynamic() As String = {"Apple", "Banana", "Orange"}
dynamic = dynamic.Except({"Apple", "Banana"}).ToArray()
关于arrays - 从动态字符串数组中删除特定索引处的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27484270/