#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