2009-10-21 2 views
22

으로 변환합니다. HashSet <T>을 .NET의 배열로 변환하려면 어떻게해야합니까?HashSet <T>을 .NET의 배열

+2

'HashSet '은 ** .Net 3.5 **에서만 사용 가능합니다. 따라서, ToArray() Linq 확장 메소드를 사용할 수 있습니다. – adrianbanks

+0

@adrianbanks : 감사합니다. 어쨌든, 나는 대답을 더 잘 맞추기 위해 질문을 편집했다. –

답변

35

HashSet<T>.CopyTo 방법을 사용하십시오. 이 메서드는 HashSet<T>의 항목을 배열에 복사합니다.

은 그래서 주어진라는 HashSet<String>stringSet 당신이 이런 짓을 할 것이다 :

String[] stringArray = new String[stringSet.Count]; 
stringSet.CopyTo(stringArray); 
+8

HashSet.ToArray()가 더 간단합니다. –

+0

ToArray가 있습니까? 찾을 수 없습니다. – Konstantin

+6

@Konstantin HashSet 에는 .ToArray() 메소드가 있지만 내부입니다. 그러나 내부적으로 .CopyTo()를 사용하는 LINQ의 .ToArray() 확장 메서드를 사용할 수 있습니다. HashSet 은 ICollection 을 구현하고 LINQ의 .ToArray() 구현은 ICollection 의 특별한 경우를 갖기 때문에 사용할 수 있습니다. – flai

0

나는 어떤 ICollection<T> 구현으로

function T[] ToArray<T>(ICollection<T> collection) 
{ 
    T[] result = new T[collection.Count]; 
    int i = 0; 
    foreach(T val in collection) 
    { 
     result[i++] = val; 
    } 
} 

을 것 같아요.

사실 당신이 HashSet<T> 클래스를 사용하는 System.Core를 참조해야하기 때문에 사실 당신은뿐만 아니라 그것을 사용할 수 있습니다 : 당신이 System.Collections.Generic.HashSet을 의미하는 경우

T[] myArray = System.Linq.Enumerable.ToArray(hashSet); 
+0

CopyTo를 사용하면 왜 열심히 일합니까? – Vitaliy

+1

보다 일반적인 (모든 ICollection 에 적용됨) CopyTo는 어쨌든 수동으로 배열을 할당해야합니다. –

17

, 그것은 종류의 하드 클래스는 않기 때문이다 프레임 워크 3.5 이전에는 존재하지 않습니다.

3.5 이상이면 HashSet이 IEnumerable을 구현 한 이후 ToArray를 사용하십시오.

using System.Linq; 
... 
HashSet<int> hs = ... 
int[] entries = hs.ToArray(); 

자신 만의 HashSet 클래스가 있다면 말하기 어렵습니다.

+0

이 질문에 대한 답변보기 : http://stackoverflow.com/questions/687034/using-hashset-in-c-2-0-compatible-with-3-5 –

+1

답변에서 인용 : "HashSet을 사용할 수 있습니다. 2.0 응용 프로그램에 - 지금 참조 System.Core.dll ... 참고 : 이렇게하려면 .NET 3.5 프레임 워크를 설치해야합니다. " IMO, 프레임 워크 3.5의 일부를 사용하는 경우 3.5가 아닌 2.0을 사용합니다. 대부분의 시스템 DLL은 프레임 워크 3.5에서도 버전 2.0.0.0으로 표시됩니다. – erikkallen