【发布时间】:2011-08-08 05:00:57
【问题描述】:
我有:
Dim arr() As String = {"one","two","three"}
我想要一个新数组 sub,只包含 {"one", "three"}。最好的方法是什么?
【问题讨论】:
我有:
Dim arr() As String = {"one","two","three"}
我想要一个新数组 sub,只包含 {"one", "three"}。最好的方法是什么?
【问题讨论】:
对于这种特殊情况,最简单的选择就是列出您要复制的两项:
Dim sub = {arr(0), arr(2)}
在一般情况下,如果您想获取第一项,跳过一项,然后获取其余所有内容,一个简单的选择是使用 LINQ 扩展方法:
Dim sub = arr.Take(1).Concat(arr.Skip(2)).ToArray()
它产生
{"one"} (arr.Take(1)) Concat) 连接{"three"} (arr.Skip(2))ToArray())文档:
【讨论】:
您可以使用Array.Copy 方法。我不知道你是如何从你的数组中挑选元素的。你是随机挑选还是其他方式?但我认为您需要创建第二个数组并使用 Copy 方法。
您可以通过多种方式使用复制方法。我上面给出的链接是从第一个数组的指定索引中选择一个元素并复制到第二个数组的指定索引。
这是一个 C# 示例:
string[] firstArray = {"dog","cat","fish","monkey"};
string[] secondArray = firstArray;
Array.Copy(firstArray,3,secondArray,0,1);
Console.WriteLine(secondArray[0].ToString());
这里有一个 VB.NET 示例:
在您的情况下,您可以将 Array.Copy 放在一个循环中并不断更改源和目标索引。
【讨论】:
确切地看到你想要什么有点困难,但这样的事情会奏效。
Dim arr() As String = {"one","two","three"}
Dim templist As New List(Of String)(arr)
templist.RemoveAt(1)
Dim sub() As String = templist.ToArray()
就我个人而言,如果您想经常进行这样的更改,我会使用List 而不是String()。
编辑:考虑 RPK 的评论如下:
Function RemoveElements(ByVal arr() As String, ByVal ParamArray skip() As Integer) As String()
Dim templist As New List(Of String)(arr.Length - skip.Length)
For i As Integer = 0 to templist.Length - 1
if Array.IndexOf(skip, i) = -1 Then templist.Add(arr(i))
Next i
Return templist.ToArray()
End Function
您可以为单个元素调用它:
' Skips the second element.
Dim sub() As String = RemoveElements(arr, 1)
或使用任意数量的元素:
' Skips the second, fourth, seventh and eleventh elements.
Dim sub() As String = RemoveElements(arr, 1, 3, 6, 10)
或使用数组:
' Skips the second, fourth, seventh and eleventh elements.
Dim skip() As Integer = {1, 3, 6, 10}
Dim sub() As String = RemoveElements(arr, skip)
注意,这是很慢的代码,但它可以使您的代码更易于阅读和维护。
【讨论】: