【问题标题】:Efficient way to get all elements from a HashSet in .NET从 .NET 中的 HashSet 获取所有元素的有效方法
【发布时间】:2013-04-07 03:50:46
【问题描述】:

说,我有一个带有元素的 HashSet:

HashSet<int> hsData = new HashSet<int>();

有时我需要处理这些元素(一个接一个)。我当然可以将其转换为数组并以这种方式使用它:

int[] arr = hsData.ToArray();

但我不确定这种转换的效率如何?

我看到人们建议在 HashSet 本身上使用 foreach,但由于我的代码架构,我无法使用它。我需要一些可以这样工作的东西:

它是最后一个元素吗?如果没有,那么得到它并前进到下一个 元素。

【问题讨论】:

  • 我并没有真正理解这个问题......但是...... “但我不确定这种转换的效率如何?” 你有没有检查它是否是重要和重要?不要费心改进没有任何影响的东西。
  • HashSet 中的“最后一个元素”是什么?套装没有排序。
  • @dtb 我认为他的意思是最后一个可用的元素。
  • 您对为什么不能使用foreach 的解释似乎非常站不住脚。如果您能在此处提供更多详细信息,这将非常有帮助,因为 foreach 循环是迄今为止处理集合中每个项目的最自然的解决方案。
  • 正如@JonSkeet 所说 - 如果您不想对最后一个元素进行任何特殊处理,foreach 将是您的最佳选择。您的场景正是 foreach 的用途(除非您的问题中没有包含其他因素)。如果您想要更多控制权,也可以使用 for 循环和 HashSet.Count

标签: c# asp.net .net hashset


【解决方案1】:

如果你愿意,你可以使用 foreach。只需保持给定列表中所有元素的运行计数器,在进行迭代时递减,然后与计数器进行比较。

另一方面,把它变成一个数组很重要吗?这个操作会发生 1000 次吗?

【讨论】:

    【解决方案2】:

    正如您所说,转换为数组可能会带来一些性能缺陷。 foreach 在幕后所做的是在 HashSet 中获取一个枚举器并运行它。

    HashSet&lt;T&gt; 还实现了IEnumerable&lt;T&gt;,它可用于以更有效的方式枚举集合。在IEnumerable 上查看here 以获取参考。

    【讨论】:

      【解决方案3】:

      ToArray 不(尚)存在,但您可以使用CopyTo

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 2013-09-11
      • 2012-02-03
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多