更简单的方法来检查参数是否是特定类型的数组?

时间:2017-06-17 14:23:23

标签: vb.net casting

目前我在课堂上有以下方法。在调用它时,如果数组是长度为3的数组,则该类仅存储数据,并对前两个元素设置特定约束。

但是,以下代码对我来说似乎很笨拙和低效,特别是如果我正在处理更大的数组。但是,如果不使用Try块,我无法找到更好的方法来执行此操作,并且想在此处询问是否可能。

Overrides Sub output(ByVal data As Object)

    Dim array() As Object = TryCast(data, Object())

    If Not array Is Nothing AndAlso array.Length = 3 Then

        For Each element In array
            If Not TypeOf (element) Is Integer Then Return
        Next

        If Not (array(0) = -1 OrElse array(1) = -1) Then

            memory.Add(array)
        End If
    End If
End Sub

2 个答案:

答案 0 :(得分:1)

首先 - 我建议不要使用Return,而是使用Exit Sub,因为这更加明显和可读。

根据你的代码,我假设传递给sub的参数可能不是数组,如果它是一个数组,它可能是一个混合对象的数组而不是所有的元素是整数或单身。如果数组中的所有元素总是相同的类型,那么你可以检查第一个元素是一个整数类型,而不是检查数组的所有元素。(这不是同一个检查值本身是否为整数。您仍然可以使用Single类型,其值为1)

例如..简单地用

替换上面的循环
If Not TypeOf (array(0)) Is Integer Then Exit Sub

如果数组是混合对象,你可以尝试使用Parallel.ForEach循环运行该检查来加快速度......就像这样

Parallel.ForEach(array,
            Sub(element)
                If Not TypeOf (element) Is Integer Then
                    Exit Sub
                End If
            End Sub)

但是 - 多线程处理循环中少量代码的处理开销可能会导致性能下降。如果实际循环中的代码较长,您可能会获益。

另一种方法是使用Array.TrueForAll函数。用

替换你的循环
If Not System.Array.TrueForAll(array, AddressOf IsIntegerType) Then
    Exit Sub
End If

并添加一个函数,如果对象是整数,则返回true。

Private Function IsIntegerType(value As Object) As Boolean
    If TypeOf (value) Is Integer Then
        Return True
    Else
        Return False
    End If
End Function

您必须对这些进行基准测试,以确定您自己的代码中哪个最快。如果可能存在问题,请检查内存使用情况。

答案 1 :(得分:0)

这可能是输出Sub。不知道这是否有所改善。

    If data Is Nothing Then Exit Sub
    Dim t As Type = data.GetType
    Dim a() As Object
    If t.IsArray Then
        a = DirectCast(data, Object())
        If Not (a IsNot Nothing AndAlso a.Length = 3 AndAlso TypeOf a(0) Is Integer) Then
            Exit Sub
        End If
        'other code
        If Not (CInt(a(0)) = -1 OrElse CInt(a(1)) = -1) Then
            memory.Add(foo)
        End If
    End If