【问题标题】:Method to increment array parameter without types增加无类型数组参数的方法
【发布时间】:2021-11-17 19:34:36
【问题描述】:

我正在尝试创建一种方法来执行增量和赋值操作,如下所示:

Public Sub ArrayAdd(ByRef arr As Object(), newItem As Object)
        Try
            If IsNothing(arr) Then
                arr = New Object() {newItem}
                Exit Sub
            End If
            Array.Resize(arr, arr.Length + 1)
            arr(arr.Length - 1) = newItem
        Catch ex As Exception
            Throw New ApplicationException(ex.Message, ex)
        End Try
    End Sub`

使用这种方法会产生类型转换错误,所以我想使用泛型Of T(没有成功)。

【问题讨论】:

  • 你没有提到你的List<T>newItem是什么类型,或者T是否是一个接口。您可能应该发布创建通用方法的失败尝试。此外,是否有特定原因使用 Array 而不是 List 或类似集合(因此您不需要手动处理此操作)?
  • 找到了解决方案,我将在这篇文章中将其写为答案。这背后的原因是因为数组在读/写/迭代操作中更快,而且我(唉)正在开发一个 winform 应用程序。我需要尽可能优化。
  • List 在后台使用数组并实现经过测试和优化的代码来缓存、调整大小和调整内容大小。你试图做的没有真正的用处。它不是唯一的现有集合类型。您还有其他性能更好的集合类型,可以根据具体用例进行选择。 WinForms 平台也与此没有直接联系。您应该发布一个与您实际尝试对数组执行的操作相关的特定问题。
  • 如果您需要优化,那么大概您已经在典型工作负载下测量了ArrayList(Of T) 的性能,发现Array 明显更快?在没有测量的情况下假设代码中的阻塞点总是很危险的。
  • 是的,使用数组开发的相同程序比使用列表快得多。无论如何,我要实现的最后一个改进是在可能的情况下从 AoS 更改为 Soa。我在 Dmitri Nesteruk 的课程中​​发现了列表和数组之间的这种区别,在关于复合代理的讲座中,他使用数组而不是列表,我只是想知道为什么。

标签: arrays vb.net generics


【解决方案1】:

泛型方法完全按照您的预期工作:

Public Sub AppendElement(Of T)(ByRef array As T(), element As T)
    If array Is Nothing Then
        array = {element}
    Else
        Dim upperBound = array.Length

        System.Array.Resize(array, upperBound + 1)
        array(upperBound) = element
    End If
End Sub

【讨论】:

  • 是的,我刚刚找到了相同的解决方案,出于某种奇怪的原因,Visual Studio 不允许我这样写下来,我不得不使用“更改签名”命令对其进行重构。还是谢谢!
【解决方案2】:

这是方法实现

   Public Sub ArrayAdd(Of T)(ByRef arr() As T, item As T)
    Try
        If IsNothing(arr) Then
            arr = New T() {item}
            Exit Sub
        End If
        Array.Resize(arr, arr.Length + 1)
        arr(arr.Length - 1) = item
    Catch ex As Exception
        Throw New ApplicationException(ex.Message, ex)
    End Try
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多