代码之家  ›  专栏  ›  技术社区  ›  Will Marcouiller

将集合转换为数组的最优化/最有效的方法是什么?

  •  1
  • Will Marcouiller  · 技术社区  · 15 年前

    我知道一定有人问了两次以上,但我找不到任何合适的问题来回答这个问题。

    我有一个集合,希望从.NET 2.0中检索数组。换句话说,我要将集合转换为数组。到目前为止,我有以下几点:

    Public Class Set(Of T)
        Implements IEnumerable(Of T)
        Implements ICollection(Of T)
        Implements IEqualityComparer(Of T)
    
        Private _set as Dictionary(Of T, Object)
    
        // Implementing the interfaces here...
    
        Public Function ToArray() As Array
            Dim arr As Array = Array.CreateInstance(GetType(T), Me.Count)
            Me.CopyTo(arr, 0)
            Return arr
        End Function
    End Class
    

    然后,当我打电话给它时,我只需要:

    Dim propertiesToLoad As CustomSet(Of String) = New CustomSet(Of String)()
    // Initializing my CustomSet here...
    
    Dim searcher As DirectorySearcher = New DirectorySearcher()
    Dim entry As DirectoryEntry = New DirectoryEntry("LDAP://" & Environment.UserDomain)
    
    searcher.SearchRoot = entry
    searcher.SearchScope = SearchScope.Subtree
    searcher.Filter = someFilter
    searcher.PropertiesToLoad.AddRange(propertiesToLoad.ToArray())
    
    // Launching search here...
    

    在.NET 2.0中有更有效的方法吗?

    编辑第1页

    count和copyto在my customset(of t)中的实现:

    Public ReadOnly Property Count As Integer Implements ICollection(Of T).Count
        Get
            Return _set.Keys.Count
        End Get
    End Property
    
    Public Sub CopyTo(ByVal array As T, ByVal arrayIndex As Integer) Implements ICollection(Of T).CopyTo
        _set.Keys.CopyTo(array, arrayIndex)
    End Sub
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   Guffa    15 年前

    你不需要使用 CreateInstance 要创建数组,您知道类型,甚至可以将其作为特定类型的数组返回:

    Public Function ToArray() As T()
      Dim arr(Me.Count) As T
      Me.CopyTo(arr, 0)
      Return arr
    End Function
    

    当然,它的效率取决于 ICollection(Of T).Count ICollection(Of T).CopyTo 是。

        2
  •  1
  •   SLaks    15 年前

    你应该改变你的 AddRange 采用的方法 IEnumerable<T> ICollection<T> (如果你需要 Count )
    这样你就不用打电话了 ToArray 总之,保存一个内存分配。

    您的实现看起来不错。
    但是,请注意 Dictionary<TKey, TValue> 是无序的