目前我在课堂上有以下方法。在调用它时,如果数组是长度为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
答案 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