Próbuję połączyć moje 2 tablice,
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)  

Co dzieje się po połączeniu, to wydrukować tylko pojedyncze wartości

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

Kupić to tylko wydruki ,c,d, powinien wydrukować wszystkie pojedyncze elementy występujące raz w obu 2 tablicach po ich połączeniu, które powinny być c,d,z. Co jest nie tak w moim kodzie? Dzięki.

1
Randy Ortega 24 luty 2019, 21:32

2 odpowiedzi

Najlepsza odpowiedź

Ponieważ dwie tablice Źródło mogą mieć różne górne granice, będziesz musiał iterować, używając wyższych z tych dwóch, a także nie upewnij się dostępu indeksów poza granicami krótszej tablicy

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

To przeplatają wyniki jak to zrobił.


Jeśli przeplatanie nie jest wymagane i po prostu jesteś zainteresowany wynikiem (a nie algorytm), możesz po prostu zrobić:

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

Zwraca to elementy występujące dokładnie raz w arr1 lub arr2.

2
Olivier Jacot-Descombes 24 luty 2019, 21:52

Inne podejście przy użyciu 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
1
Mary 24 luty 2019, 20:58