во вновь включенном массиве отсутствует элемент - vb - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь объединить мои 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.Что не так в моем коде?Благодарю.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Другой подход с использованием 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
0 голосов
/ 24 февраля 2019

Поскольку у двух исходных массивов могут быть разные верхние границы, вам придется выполнять итерацию, используя старшее из двух значений, а также избегать доступа к индексам за пределами более короткого массива

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

Возвращает элементы, встречающиеся ровно один раз в arr1 или arr2.

...