如何在VB.NET中从较大的数组中获取子数组?

时间:2011-08-08 05:00:58

标签: .net vb.net arrays

我有:

Dim arr() As String = {"one","two","three"}

我想要一个新的数组sub,只包含{“one”,“three”}。这样做的最佳方法是什么?

3 个答案:

答案 0 :(得分:6)

对于这种特殊情况,最简单的选择就是列出要复制的两个项目:

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()

文档:

答案 1 :(得分:2)

您可以使用Array.Copy方法。我不知道你是如何从阵列中挑选元素的。你是随机挑选还是其他任何方式?但我认为你需要创建第二个数组并使用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示例在这里:

Arrays: Copy vs. Clone

在您的情况下,您可以将 Array.Copy 放入循环中并不断更改源索引和目标索引。

答案 2 :(得分:0)

看到你想要的东西有点困难,但是这样的东西会起作用。

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)

请注意,这是一个很慢的代码,但它可以使您的代码更易于阅读和维护。