Самый оптимизированный / эффективный способ конвертировать коллекцию в массив? - PullRequest
1 голос
/ 06 июля 2010

Я знаю, что его нужно было задавать более двух раз, но я не смог найти подходящий вопрос, чтобы ответить на него.

У меня есть коллекция, из которой я хочу получить массив в .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 в моем 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 ]

1 голос
/ 06 июля 2010

Вам не нужно использовать 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.

1 голос
/ 06 июля 2010

Вы должны изменить свой AddRange метод на IEnumerable<T> или ICollection<T> (если вам нужно Count).
Таким образом, вам не нужно будет звонить ToArrayвообще, сохраняя выделение памяти.

Ваша реализация выглядит нормально.
Однако обратите внимание, что Dictionary<TKey, TValue> неупорядочено.

...