VB.NET : Значение типа ‘Integer’ не может быть преобразовано в ‘System.Массив’

#vb.net

#vb.net

Вопрос:

В приведенном ниже коде я получаю следующую ошибку в строке If (Not hash.Add(Numbers(Num))) Then Значение типа ‘Integer’ не может быть преобразовано в ‘System.Массив’. Что я делаю не так?

 Module Module1

Sub Main()

    Dim array() As Integer = {5, 10, 12, 8, 8, 14}

    ' Pass array as argument.
    Console.WriteLine(findDup(array))

End Sub

Function findDup(ByVal Numbers() As Integer) As Integer

    Dim hash As HashSet(Of Array)

    For Each Num In Numbers

        If (Not hash.Add(Numbers(Num))) Then
            Return (Num)
        End If

    Next

End Function

End Module
  

Комментарии:

1. В дополнение к текущей ошибке (на которую ответил @shahkalpesh), маловероятно, что вы захотите использовать Numbers(Num) в своем вызове Add , поскольку Num это уже значение, извлеченное из Numbers массива.

Ответ №1:

Внутри findDup это

 Dim hash As HashSet(Of Array)
  

Должно быть

 Dim hash As HashSet(Of Integer)
  

РЕДАКТИРОВАТЬ: Как предложил @Damien_The_Unbeliever, код

Эта строка

 If (Not hash.Add(Numbers(Num))) Then
  

Должно быть

 If (Not hash.Add(Num)) Then
  

Комментарии:

1. Все равно выдаст ошибку Index Out of Bounds из-за того, как он пытается добавить к хэш-набору во время цикла

2. @D..: Редактирование было выполнено, когда вы добавляли приведенный выше комментарий.

Ответ №2:

Вы создали хэш-набор Array, а не хэш-набор Integer. Вы могли бы изменить его на Integer и изменить способ добавления элементов в вашем цикле к:

 Function findDup(ByVal Numbers() As Integer) As Integer

    Dim hash As New HashSet(Of Integer)

    For Each Num In Numbers

        If (Not hash.Add(Num)) Then
            Return (Num)
        End If

    Next

End Function
  

Я надеюсь, вы понимаете, что он всегда найдет только первый дубликат и не вернет значение любого типа, если не найдет дубликат.

Ответ №3:

Вы объявили, что оно hash равно HashSet(Of Array) , что означает, что оно содержит массивы. Но вы пытаетесь добавить к нему целые числа.

Вам нужно либо изменить его объявление ( HashSet(Of Integer) ), либо изменить вызов на Add ( Add(Numbers) ).

Какое решение вы используете, будет зависеть от ваших намерений. Я предполагаю, что вы хотите изменить тип hash .

Ответ №4:

Это то, что вы имеете в виду сделать?

 Sub Main()

    Dim someArray() As Integer = {5, 10, 12, 8, 7, 8, 8, 10, 14, 10}

    ' Pass array as argument.
    Dim foo As List(Of Integer) = findDups(someArray)
    'foo contains a list of items that have more than 1 occurence in the array
End Sub

Function findDups(ByVal Numbers() As Integer) As List(Of Integer)
    Dim rv As New List(Of Integer)
    For idx As Integer = 0 To Numbers.Length - 1
        If Array.LastIndexOf(Numbers, Numbers(idx)) <> idx Then
            If Not rv.Contains(Numbers(idx)) Then rv.Add(Numbers(idx))
        End If
    Next
    Return rv
End Function