【问题标题】:Most optimized/effective way to convert a collection into an array?将集合转换为数组的最优化/最有效的方法?
【发布时间】:2011-03-12 10:16:33
【问题描述】:

我知道它肯定被问了两次以上,但我找不到任何适用的问题来回答这个问题。

我有一个集合,我希望从 .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

我的 CustomSet(Of T) 中 Count 和 CopyTo 的实现:

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

【问题讨论】:

    标签: c# vb.net arrays collections .net-2.0


    【解决方案1】:

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

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

    这有多高效,当然取决于您对ICollection(Of T).CountICollection(Of T).CopyTo 的实现有多高效。

    【讨论】:

    • 那个,我不知道在VB.NET中怎么做。感谢您的建议!至于 Count 和 CopyTo 的实现,请参阅我将在我的 EDIT #1 中提供的代码。谢谢! =)
    • @Will:这看起来足够高效。如果您直接遍历字典中的项目而不是使用 Keys 集合,可能会稍微改进它,但这不值得增加复杂性。
    • 感谢您的评论和改进的痕迹,尽管由于复杂性这些几乎不值得。我很欣赏这些提示。 =)
    【解决方案2】:

    您应该将AddRange 方法更改为IEnumerable<T>ICollection<T>(如果您需要Count)。
    这样,您根本不需要调用ToArray,节省了内存分配。

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

    【讨论】:

    • DirectorySearcher 是一个 .NET 类,是 System.DirectoryServices 命名空间的一部分。 PropertiesToLoad 是 StringCollection,所以不能更改
    • 同意!谢谢你的提示。因此,我无法更改AddRange() 方法,因为它是.NET 2.0 的一部分,根据System.DirectoryServices.DirectorySearcher.PropertiesToLoad.AddRange()。尽管如此,PropertiesToLoad 属性是StringValueCollection。我想可能有某种方法可以将我的收藏直接分配给它,但它似乎无法按原样工作。根据您的想法,我可以做出哪些改变以使其成为可能?我应该在我的CustomSet(Of T) 类中实现一个额外的接口,以便它与StringValueCollection 类兼容吗?
    猜你喜欢
    • 2010-09-18
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多