Я знаю, что это, должно быть, спросили более двух раз, но я не мог найти применимый вопрос ответить на вопрос.
У меня есть набор, от которого я хочу получить массив в.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
Вам не нужно использовать 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
.
Вы должны изменить свой метод AddRange
, чтобы он принимал IEnumerable
или ICollection
(если вам нужно Count
]).
Таким образом, вам вообще не нужно будет вызывать ToArray
, сохраняя выделение памяти.
Ваша реализация выглядит нормально.
Однако обратите внимание, что Dictionary
неупорядочен.