2009-10-21 2 views

Antwort

35

Verwenden Sie die HashSet<T>.CopyTo Methode. Diese Methode kopiert die Elemente von HashSet<T> in ein Array.

So ein gerufener HashSet<String> gegeben stringSet Sie würde so etwas wie tun:

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

HashSet.ToArray() ist einfacher –

+0

Gibt es ein ToArray? Ich kann es nicht finden – Konstantin

+6

@Konstantin HashSet hat eine .ToArray() -Methode, aber es ist intern. Sie können jedoch die Erweiterungsmethode .ToArray() von LINQ verwenden, die intern .CopyTo() verwendet (da HashSet ICollection implementiert und LINQs .ToArray() - Implementierung einen Sonderfall für ICollection hat). – flai

0

Ich denke,

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

wie für jede ICollection<T> Umsetzung.

Eigentlich in der Tat, wie Sie System.Core verweisen muss die HashSet<T> Klasse zu verwenden, wie gut Sie können es verwenden:

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

Warum hart arbeiten, wenn Sie CopyTo haben? – Vitaliy

+1

Da es generischer ist (es gilt für jede ICollection ) und CopyTo erfordern, dass Sie das Array trotzdem manuell zuweisen. –

17

Wenn Sie System.Collections.Generic.HashSet meine, es ist ziemlich schwer, da diese Klasse tut existiert nicht vor Rahmen 3.5.

Wenn Sie meinen, dass Sie auf 3.5 sind, verwenden Sie einfach ToArray, da HashSet IEnumerable implementiert, z.

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

Wenn Sie Ihre eigene HashSet-Klasse haben, ist es schwer zu sagen.

+0

Siehe die Antwort auf diese Frage: http://stackoverflow.com/questions/687034/using-hashset-in-c-2-0-compatible-with-3-5 –

+1

Zitat aus dieser Antwort: "Sie können HashSet verwenden in einer 2.0-Anwendung jetzt - nur Referenz System.Core.dll ... Hinweis: Dies würde erfordern, dass Sie die .NET 3.5-Framework installieren ". IMO, wenn Sie Teile von Framework 3.5 verwenden, dann verwenden Sie 3.5 und nicht 2.0. Die meisten System-DLLs sind selbst in Framework 3.5 als Version 2.0.0.0 markiert. – erikkallen

Verwandte Themen