Большая часть оптимизированного/эффективного способа преобразовать набор в массив?

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

У меня есть набор, от которого я хочу получить массив в.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 (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
задан Will Marcouiller 6 July 2010 в 17:39
поделиться

2 ответа

Вам не нужно использовать 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
ответ дан 2 September 2019 в 23:15
поделиться

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

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

1
ответ дан 2 September 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: