从动态字符串数组中删除特定索引处的项目

时间:2014-12-15 12:36:51

标签: arrays vb.net linq dynamic-arrays

我有一个动态字符串数组,我使用ReDim等填充了一些动态值。我想从特定位置的字符串数组中删除一个项目。我已经阅读过使用System.Linq使用Where条件但是无法真正得到正确的答案。有什么建议吗?

Dim dynamic() as String
...
Redim dynamic(2)
..
dynamic(0) = Apple
dynamic(1) = Banana
dynamic(2) = Orange
..

dynamic(i).Remove... etc?

2 个答案:

答案 0 :(得分:3)

正如其他人所提到的,技术上无法从数组中删除元素。修改数组中元素数量的唯一方法是创建一个全新的数组并将内容从一个复制到另一个。您可以使用更方便的方法来实现它,但最终,这就是他们实际为您做的,就在幕后。

如果您要做很​​多这样的事情,我建议使用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()

答案 1 :(得分:1)

您无法直接使用数组进行操作。但你可以这样做:

Dim tmp = New List(Of string)(dynamic)
tmp.RemoveAt(index)
dynamic = tmp.ToArray()