【问题标题】:Convert a HashSet<T> to an array in .NET将 HashSet<T> 转换为 .NET 中的数组
【发布时间】:2010-12-08 21:17:03
【问题描述】:

如何在 .NET 中将 HashSet 转换为数组?

【问题讨论】:

  • HashSet&lt;T&gt; 仅在 .Net 3.5 中可用。因此,您可以使用ToArray() Linq 扩展方法。
  • @adrianbanks:谢谢。无论如何,我编辑了问题以更好地匹配答案。

标签: .net arrays hashset


【解决方案1】:

使用HashSet&lt;T&gt;.CopyTo 方法。此方法将 HashSet&lt;T&gt; 中的项目复制到数组中。

所以给定一个名为stringSetHashSet&lt;String&gt;,你会做这样的事情:

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

【讨论】:

  • HashSet.ToArray() 更简单
  • 有 ToArray 吗?好像没找到
  • @Konstantin HashSet 有一个 .ToArray() 方法,但它是内部的。但是,您可以使用内部使用 .CopyTo() 的 LINQ 的 .ToArray() 扩展方法(因为 HashSet 实现 ICollection 并且 LINQ 的 .ToArray() 实现对 ICollection 有特殊情况)。
【解决方案2】:

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

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

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

如果你有自己的 HashSet 类,那就不好说了。

【讨论】:

  • 查看这个问题的答案:stackoverflow.com/questions/687034/…
  • 引用该答案:“您现在可以在 2.0 应用程序中使用 HashSet - 只需引用 System.Core.dll ... 注意:这需要您安装 .NET 3.5 框架”。 IMO,如果您使用部分框架 3.5,那么您使用的是 3.5 而不是 2.0。即使在框架 3.5 上,大多数系统 DLL 都标记为 2.0.0.0 版本。
【解决方案3】:

我猜

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&lt;T&gt; 实现。

实际上,您必须引用System.Core 才能使用HashSet&lt;T&gt; 类,您不妨使用它:

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

【讨论】:

  • 因为它更通用(它适用于任何 ICollection)并且 CopyTo 要求您手动分配数组。
【解决方案4】:

现在您可以更简单地使用List&lt;T&gt; 构造函数(列表是现代数组:)。 例如,在 PowerShell 中:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多