2009-10-21 55 views
22

如何將HashSet <T>轉換爲.NET中的數組?將HashSet <T>轉換爲.NET中的數組

+2

'HashSet的'只適用於** .NET 3.5 **。因此,您可以使用'ToArray()'Linq擴展方法。 – adrianbanks 2009-10-21 21:23:59

+0

@adrianbanks:謝謝。無論如何,我編輯了這個問題以更好地匹配答案。 – 2009-10-21 21:31:59

回答

35

使用HashSet<T>.CopyTo方法。該方法將HashSet<T>中的項目複製到數組中。

所以給予HashSet<String>稱爲stringSet你會做這樣的事情:

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

HashSet.ToArray()更簡單 – 2011-12-09 02:21:17

+0

有沒有ToArray?我似乎無法找到它 – Konstantin 2012-12-19 09:38:55

+6

@Konstantin HashSet 有一個.ToArray()方法,但它是內部的。但是,你可以用它在內部使用.CopyTo()LINQ的.ToArray()擴展方法(因爲HashSet的實現ICollection的和LINQ的.ToArray()實現對ICollection的的一個特例)。 – flai 2013-02-12 11:42:49

0

我猜

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

爲任何ICollection<T>實施。

其實事實上,你必須引用System.Core使用HashSet<T>類,你還不如用它:

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

爲什麼在CopyTo時努力工作? – Vitaliy 2009-10-21 21:13:47

+1

因爲它更通用(它適用於任何ICollection )並且CopyTo要求您仍然手動分配數組。 – 2009-10-21 21:16:54

17

如果你的意思System.Collections.Generic.HashSet,這是一種很難,因爲那類不在框架3.5之前不存在。

如果你的意思是你在3.5,只需使用ToArray的,因爲HashSet的實現IEnumerable,例如

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從答案 – 2009-10-21 21:24:08

+1

名言:「你可以使用的HashSet 現在在2.0應用程序中 - 只需引用System.Core.dll ...注意:這將需要您安裝.NET 3.5框架「。國際海事組織,如果你使用框架3.5的部分,那麼你使用的是3.5而不是2.0。即使在框架3.5上,大多數系統DLL也被標記爲版本2.0.0.0。 – erikkallen 2009-10-22 10:30:38