2010-07-06 3 views
1

Je sais qu'il a dû être demandé plus de deux fois, mais je n'ai trouvé aucune question applicable pour répondre à la question.Le moyen le plus optimisé/efficace de convertir une collection en tableau?

J'ai une collection que je veux récupérer un tableau de .NET 2.0. En d'autres termes, je veux convertir une collection en tableau. Jusqu'à présent, je donne les résultats suivants:

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 

Et puis, quand je l'appeler, je dois simplement:

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... 

est-il un moyen plus efficace de le faire dans .NET 2.0 ?

EDIT # 1

Implémentations du comte et CopyTo dans mon 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 

Répondre

1

Vous n'avez pas besoin d'utiliser CreateInstance pour créer le tableau, vous connaissez le type, et vous pouvez même le retourner comme un tableau du type spécifique:

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

Comment est-ce efficace, bien sûr repose sur l'efficacité de vos implémentations de ICollection(Of T).Count et ICollection(Of T).CopyTo. DirectorySearcher est une classe .NET faisant partie de l'espace de noms System.DirectoryServices.

+0

Cela, je ne savais pas comment faire dans VB.NET. Merci pour cette suggestion! En ce qui concerne les implémentations de Count et CopyTo, veuillez voir le code que je vais fournir dans mon EDIT # 1. Merci! =) –

+0

@Will: Cela semble assez efficace. Il pourrait être possible de l'améliorer légèrement si vous parcourez directement les éléments du dictionnaire au lieu d'utiliser la collection 'Keys', mais cela ne vaut guère la peine. – Guffa

+0

Merci pour votre commentaire et des traces d'amélioration, même si celles-ci ne valent pas le coup en raison de la complexité. J'apprécie ces conseils. =) –

1

Vous devez changer votre méthode AddRange prendre un IEnumerable<T> ou un ICollection<T> (si vous avez besoin de Count).
De cette façon, vous n'aurez plus besoin d'appeler ToArray, en enregistrant une allocation de mémoire.

Votre mise en œuvre semble bien.
Cependant, notez que Dictionary<TKey, TValue> n'est pas ordonné.

+1

PropertiesToLoad est un StringCollection, donc il ne peut pas être changé –

+0

D'accord! Merci pour le conseil. Ainsi, je ne peux pas modifier la méthode 'AddRange()' car elle fait partie de .NET 2.0 selon 'System.DirectoryServices.DirectorySearcher.PropertiesToLoad.AddRange()'. Malgré, la propriété 'PropertiesToLoad' est un' StringValueCollection'. Je suppose qu'il pourrait y avoir un moyen d'assigner ma collection directement à elle, mais cela ne semble pas fonctionner tel quel. Quels sont, selon vos pensées, les changements que je pourrais faire pour que cela soit possible? Dois-je implémenter une interface supplémentaire dans ma classe 'CustomSet (Of T)' pour qu'elle soit compatible avec la classe 'StringValueCollection'? –

+0

J'ai raté cette partie. – SLaks

Questions connexes