2010-07-06 2 views
1

나는 두 번 이상 질문을 받았음에 틀림 없다는 것을 알고 있지만, 해당 문제에 대한 답을 찾을 수는 없습니다.컬렉션을 배열로 변환하는 가장 최적화 된/효과적인 방법은 무엇입니까?

.NET 2.0에서 배열을 검색하고자하는 컬렉션이 있습니다. 즉, 컬렉션을 배열로 변환하려고합니다. 지금까지 나는 다음과 같습니다

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을에서 할 수있는보다 효과적인 방법이 있나요 : 나는 그것을 호출있을 때 다음

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 

그리고, 나는 단지에 있습니다 ? (T의) 내 CustomSet에서

편집 # 1

백작의 구현 및 사용하는 CopyTo는 :

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의 구현에 관해서는 제 EDIT # 1에서 제공 할 코드를 참조하십시오. 감사! =) –

+0

@Will : 충분히 효율적으로 보입니다. 'Keys' 컬렉션을 사용하는 대신 직접 사전에있는 항목을 반복한다면 약간 향상시킬 수는 있지만, 복잡성을 추가 할 가치는 거의 없습니다. – Guffa

+0

귀하의 의견과 개선의 흔적을 남겨 주셔서 감사합니다. 나는이 힌트를 주셔서 감사합니다. =) –

1

당신은 (경우 IEnumerable<T> 또는 ICollection<T>을 위해 AddRange 방법을 변경해야합니다 Count 필요).
이렇게하면 ToArray을 호출 할 필요가 없으므로 메모리 할당을 절약 할 수 있습니다.

구현이 정상적으로 보입니다.
그러나 Dictionary<TKey, TValue>은 순서가 없습니다.

+1

DirectorySearcher는 System.DirectoryServices 네임 스페이스의 일부인 .NET 클래스입니다. PropertiesToLoad는 StringCollection이므로 변경할 수 없습니다. –

+0

동의! 팁 고마워. 따라서 나는'AddRange()'메소드를'System.DirectoryServices.DirectorySearcher.PropertiesToLoad.AddRange()'에 따라 .NET 2.0의 일부로 변경할 수 없다. 그럼에도 불구하고,'PropertiesToLoad' 프라퍼티는'StringValueCollection'입니다. 내 컬렉션을 직접 할당하는 방법이있을 수 있지만 그대로있는 것은 아닙니다. 당신의 생각에 따르면, 내가 그것을 가능하게 만들 수있는 변화는 무엇입니까? 'CustomSet (Of T)'클래스에 추가 인터페이스를 구현하여'StringValueCollection' 클래스와 호환되도록해야합니까? –

+0

나는 그 부분을 놓쳤다. – SLaks

관련 문제