2009-10-21 7 views
22

Come faccio a convertire un HashSet <T> ad un array in .NET?Convertire un HashSet <T> ad una matrice in .NET

+2

'HashSet ' è disponibile solo in **. Rete 3.5 **. Pertanto, è possibile utilizzare il metodo di estensione Linq 'ToArray()'. – adrianbanks

+0

@adrianbanks: Grazie. Ad ogni modo, ho modificato la domanda per abbinare meglio le risposte. –

risposta

35

Utilizzare il metodo HashSet<T>.CopyTo. Questo metodo copia gli articoli da a un array.

Quindi, dato un HashSet<String> chiamato stringSet si farebbe qualcosa di simile:

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

HashSet.ToArray() è più semplice –

+0

Esiste un ToArray? Non riesco a trovarlo – Konstantin

+6

@Konstantin HashSet ha un metodo .ToArray() ma è interno. Tuttavia, è possibile utilizzare il metodo di estensione LIN.ToArray() che utilizza internamente .CopyTo() (poiché HashSet implementa ICollection e LINQ .ToArray() ha un caso speciale per ICollection ). – flai

0

immagino

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

come per qualsiasi ICollection<T> implementazione.

In realtà, infatti, come è necessario fare riferimento System.Core utilizzare la classe HashSet<T> si potrebbe anche usarlo:

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

Perché lavorare sodo quando hai CopyTo? – Vitaliy

+1

Poiché è più generico (si applica a qualsiasi ICollection) e CopyTo richiede l'allocazione manuale dell'array. –

17

Se vuoi dire System.Collections.Generic.HashSet, è un po 'difficile in quanto quella classe fa non esiste prima del framework 3.5.

Se si intende che si è su 3,5, è sufficiente utilizzare ToArray poiché HashSet implementa IEnumerable, ad es.

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

Se si dispone della propria classe HashSet, è difficile da dire.

+0

Vedere la risposta a questa domanda: http://stackoverflow.com/questions/687034/using-hashset-in-c-2-0-compatible-with-3-5 –

+1

Citazione da tale risposta: "È possibile utilizzare HashSet in un'applicazione 2.0 ora - solo riferimento System.Core.dll ... Nota: Ciò richiederebbe l'installazione del framework .NET 3.5 ". IMO, se usi parti del framework 3.5, allora stai usando 3.5 e non 2.0. La maggior parte delle DLL di sistema sono contrassegnate come versione 2.0.0.0 anche nel framework 3.5. – erikkallen