新加入的数组缺少一个元素 - vb

问题描述 投票:1回答:2

我想合并我的2个数组, Dim arr1(3) As String arr1(0) = "a" arr1(1) = "b" arr1(2) = "c" arr1(3) = "d"

Dim arr2(4) As String arr2(0) = "a" arr2(1) = "x" arr2(2) = "x" arr2(3) = "b" arr2(4) = "z"

Dim arr3 As String() ReDim arr3(UBound(arr1) + UBound(arr2) + 1)

    Dim i As Integer
    For i = 0 To UBound(arr1)
        arr3(i * 2) = arr1(i)
        arr3(i * 2 + 1) = arr2(i)
        Label8.Text = String.Join(",", arr3)  

合并后会发生什么,只打印它的单个值

Dim r = From s In arr3 Group By s Into Group, Count() Where Count = 1 Select s Order By s Label9.Text = String.Join(",", r) Next i

买它只打印,c,d,它应该打印所有单个元素在两个数组中出现一次后合并它们应该是c,d,z。我的代码有什么问题?谢谢。

vb.net array-merge
2个回答
2
投票

由于两个源数组可以具有不同的上限,因此您必须使用两者中的较高者进行迭代,并且还要确保不访问较短数组边界之外的索引

Dim arr1() As String = {"a", "b", "c", "d"}
Dim arr2() As String = {"a", "x", "x", "b", "z"}

Dim arr3(arr1.Length + arr2.Length - 1) As String

Dim iDestination As Integer = 0
For i As Integer = 0 To Math.Max(UBound(arr1), UBound(arr2))
    If i <= UBound(arr1) Then
        arr3(iDestination) = arr1(i)
        iDestination += 1
    End If
    If i <= UBound(arr2) Then
        arr3(iDestination) = arr2(i)
        iDestination += 1
    End If
Next

这会像你一样交错结果。


如果不需要交错并且您只对结果感兴趣(而不是在算法中),您可以简单地执行:

Dim arr1() As String = {"a", "b", "c", "d"}
Dim arr2() As String = {"a", "x", "x", "b", "z"}

Dim r = From s In arr1.Concat(arr2)
    Group By s Into Group, Count()
    Where Count = 1 Select s
    Order By s

这将返回arr1arr2中恰好出现一次的元素。


1
投票

使用Array.CopyTo的另一种方法

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    Dim arr1(3) As String
    arr1(0) = "a"
    arr1(1) = "b"
    arr1(2) = "c"
    arr1(3) = "d"

    Dim arr2(4) As String
    arr2(0) = "a"
    arr2(1) = "x"
    arr2(2) = "x"
    arr2(3) = "b"
    arr2(4) = "z"

    Dim arr3 As String()
    ReDim arr3(arr1.Length + arr2.Length)

    arr1.CopyTo(arr3, 0)
    arr2.CopyTo(arr3, arr1.Length)

    For Each s As String In arr3
        Debug.Print(s)
    Next
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.