VB.NET:类型为';整数';无法转换为';系统数组';

VB.NET:类型为';整数';无法转换为';系统数组';,vb.net,Vb.net,在下面的代码中,我在第行得到以下错误,如果(不是hash.Add(Numbers(Num)),则类型为“Integer”的值无法转换为“System.Array”。我做错了什么 Module Module1 Sub Main() Dim array() As Integer = {5, 10, 12, 8, 8, 14} ' Pass array as argument. Console.WriteLine(findDup(array)) End Sub Fun

在下面的代码中,我在第
行得到以下错误,如果(不是hash.Add(Numbers(Num)),则
类型为“Integer”的值无法转换为“System.Array”。我做错了什么

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

findDup
内部,此

Dim hash As HashSet(Of Array)
应该是

Dim hash As HashSet(Of Integer)
编辑:正如@Damien\u异教徒所建议的,代码

这条线

If (Not hash.Add(Numbers(Num))) Then
应该是

If (Not hash.Add(Num)) Then

您已将
hash
声明为
HashSet(数组的)
,这意味着它包含数组。但你要给它加上整数

您需要更改其声明(
HashSet(Of Integer)
)或将调用更改为
Add
Add(Numbers)


您使用哪种解决方案取决于您的意图。我猜您想更改
散列的类型

您创建了数组的散列集,而不是整数的散列集。您可以将其更改为整数,并更改尝试在循环中添加内容的方式:

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

我希望您认识到,它只会找到第一个副本,如果找不到副本,则不会返回任何类型的值。

您的意思是这样吗

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
Sub-Main()
Dim someArray()作为整数={5,10,12,8,7,8,8,10,14,10}
'将数组作为参数传递。
Dim foo As List(整型)=findDups(someArray)
'foo包含数组中出现次数超过1次的项的列表
端接头
函数findDups(ByVal Numbers()作为整数)作为(整数的)列表
将rv标注为新列表(整数)
对于idx,整数=0到数字。长度-1
如果Array.LastIndexOf(Numbers,Numbers(idx))idx
如果不包含rv(编号(idx)),则添加rv(编号(idx))
如果结束
下一个
返回rv
端函数

除了当前的错误(由@shahkalpesh回答)之外,您不太可能希望在呼叫
Add
时使用
号码(Num)
,因为
Num
已经是从
Numbers
数组中提取的值。仍然会产生索引越界错误,因为他在loop@D..:编辑是在添加上述注释时完成的。