在.NET中将HashSet<T>转换为数组

50

我如何在.NET中将一个HashSet<T>转换为数组?


5
HashSet<T> 只能在 .Net 3.5 中使用。因此,您可以使用 ToArray() Linq 扩展方法。 - adrianbanks
1
@adrianbanks:谢谢。无论如何,我编辑了问题以更好地匹配答案。 - Agnel Kurian
4个回答

63

使用HashSet<T>.CopyTo方法。该方法将HashSet<T>中的项目复制到数组中。

因此,给定名为stringSetHashSet<String>,您可以按照以下方式进行操作:

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

15
HashSet.ToArray()更简单。 - Michael Freidgeim
2
有一个ToArray吗?我似乎找不到它。 - Konstantin
12
HashSet<T>有一个.ToArray()方法,但它是内部的。但是,您可以使用LINQ的.ToArray()扩展方法,它在内部使用.CopyTo()(因为HashSet<T>实现了ICollection<T>,而LINQ的.ToArray()实现对ICollection<T>有一个特殊情况)。 - user925777

31

如果您指的是System.Collections.Generic.HashSet,那么有点困难,因为该类在3.5框架之前不存在。

如果您的意思是您正在使用3.5,则只需使用ToArray,因为HashSet实现了IEnumerable,例如:

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

如果你有自己的HashSet类,就很难说了。


请参考以下问题的答案:https://dev59.com/83RB5IYBdhLWcg3wN08P - Julien Roncaglia
1
那个回答中的引用:“你现在可以在2.0应用程序中使用HashSet<T> - 只需引用System.Core.dll ... 注意:这将要求您安装.NET 3.5框架”。在我看来,如果你使用了3.5框架的部分功能,那么你实际上就是在使用3.5框架而不是2.0框架。即使在3.5框架上,大多数系统DLL都标记为版本2.0.0.0。 - erikkallen

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);

1
因为它更通用(适用于任何ICollection<T>),而且CopyTo要求您手动分配数组。 - Julien Roncaglia

0

现在你可以更简单地实现它,使用List<T>构造函数(列表是现代数组 :)。 例如,在PowerShell中:

$MyNewArray = [System.Collections.Generic.List[string]]::new($MySet)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接