VB.NET:类型'Integer'的值无法转换为'System.Array'

时间:2011-11-11 15:23:04

标签: vb.net

在下面的代码中,我在行If (Not hash.Add(Numbers(Num))) Then上收到以下错误} Type'Engger'的值无法转换为'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

4 个答案:

答案 0 :(得分:2)

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 :(得分:1)

您已经创建了一个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

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

答案 2 :(得分:0)

您已将hash声明为HashSet(Of Array),这意味着它包含数组。但是你正在尝试为它添加整数。

您需要更改其声明(HashSet(Of Integer))或将呼叫更改为AddAdd(Numbers))。

您使用哪种解决方案取决于您的意图。我的猜测是你要改变hash的类型。

答案 3 :(得分:0)

这是你的意思吗?

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