2010-07-06 35 views
1

我知道它一定被问了两次以上,但我找不到任何适用的问题来回答这个问题。将集合转换为数组的最优化/有效的方法?

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

实现和CopyTo从我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 

回答

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的效率如何。

+0

那,我不知道如何在VB.NET中做。感谢这个建议!至于Count和CopyTo的实现,请参阅我将在编辑#1中提供的代码。谢谢! =) – 2010-07-06 17:34:31

+0

@威尔:看起来很有效。如果你直接在字典中循环而不是使用'Keys'集合,那么稍微改进它可能是可能的,但这很难增加复杂性。 – Guffa 2010-07-06 19:44:20

+0

感谢您的评论和改进痕迹,即使这些由于复杂性而不值得。我很欣赏这些提示。 =) – 2010-07-07 13:08:52

1

你应该改变你的 AddRange方法采取 IEnumerable<T>ICollection<T>(如果你需要 Count)。
这样,您根本不需要拨打 ToArray,节省内存分配。

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

+1

DirectorySearcher是一个.NET类,是System.DirectoryServices名称空间的一部分。 PropertiesToLoad是一个StringCollection,所以它不能改变 – 2010-07-06 16:55:19

+0

同意!谢谢你的提示。因此,我不能像'System.DirectoryServices.DirectorySearcher.PropertiesToLoad.AddRange()'那样改变'AddRange()'方法,因为它是.NET 2.0的一部分。尽管如此,PropertiesToLoad属性是一个StringValueCollection。我想可能有一些方法可以直接将我的收藏集分配给它,但它似乎并不工作。根据你的想法,什么是我可以做出的改变?我应该在我的'CustomSet(Of T)'类中实现一个额外的接口,以便它与'StringValueCollection'类兼容吗? – 2010-07-06 16:57:17

+0

我错过了那部分。 – SLaks 2010-07-06 17:03:27

相关问题